[PATCH 0/3] Blackfin EMAC Driver updates for 2.6.27 (v2)
From: Bryan Wu <cooloney@kernel.org>
Date: 2008-07-27 14:45:27
Subsystems: networking drivers, the rest · Maintainers: Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Series: 3 patches touching 1 file, +81/-29
7 messages, 3 authors, 2008-07-29 · open the first message on its own page
From: Bryan Wu <cooloney@kernel.org>
Date: 2008-07-27 14:45:27
Hi Jeff, Please ignore the v1 patchset. I messed up something which Mike pointed out. Thanks a lot -Bryan
From: Bryan Wu <cooloney@kernel.org>
Date: 2008-07-27 14:45:48
From: Mike Frysinger <redacted> Signed-off-by: Mike Frysinger <redacted> Signed-off-by: Bryan Wu <cooloney@kernel.org> --- drivers/net/bfin_mac.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c
index 4144343..17951cb 100644
--- a/drivers/net/bfin_mac.c
+++ b/drivers/net/bfin_mac.c@@ -956,7 +956,7 @@ static int bfin_mac_close(struct net_device *dev) return 0; } -static int __init bfin_mac_probe(struct platform_device *pdev) +static int __devinit bfin_mac_probe(struct platform_device *pdev) { struct net_device *ndev; struct bfin_mac_local *lp;
@@ -1082,7 +1082,7 @@ out_err_probe_mac: return rc; } -static int bfin_mac_remove(struct platform_device *pdev) +static int __devexit bfin_mac_remove(struct platform_device *pdev) { struct net_device *ndev = platform_get_drvdata(pdev); struct bfin_mac_local *lp = netdev_priv(ndev);
@@ -1129,7 +1129,7 @@ static int bfin_mac_resume(struct platform_device *pdev) static struct platform_driver bfin_mac_driver = { .probe = bfin_mac_probe, - .remove = bfin_mac_remove, + .remove = __devexit_p(bfin_mac_remove), .resume = bfin_mac_resume, .suspend = bfin_mac_suspend, .driver = {
--
1.5.6
From: Bryan Wu <cooloney@kernel.org>
Date: 2008-07-27 14:46:05
Signed-off-by: Bryan Wu <cooloney@kernel.org> --- drivers/net/bfin_mac.c | 103 ++++++++++++++++++++++++++++++++++++------------ 1 files changed, 77 insertions(+), 26 deletions(-)
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c
index 17951cb..57ebe6d 100644
--- a/drivers/net/bfin_mac.c
+++ b/drivers/net/bfin_mac.c@@ -606,36 +606,87 @@ adjust_head: static int bfin_mac_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) { - unsigned int data; + u16 *data; current_tx_ptr->skb = skb; - /* - * Is skb->data always 16-bit aligned? - * Do we need to memcpy((char *)(tail->packet + 2), skb->data, len)? - */ - if ((((unsigned int)(skb->data)) & 0x02) == 2) { - /* move skb->data to current_tx_ptr payload */ - data = (unsigned int)(skb->data) - 2; - *((unsigned short *)data) = (unsigned short)(skb->len); - current_tx_ptr->desc_a.start_addr = (unsigned long)data; - /* this is important! */ - blackfin_dcache_flush_range(data, (data + (skb->len)) + 2); - + if (ANOMALY_05000285) { + /* + * TXDWA feature is not avaible to older revision < 0.3 silicon + * of BF537 + * + * Only if data buffer is ODD WORD alignment, we do not + * need to memcpy + */ + u32 data_align = (u32)(skb->data) & 0x3; + if (data_align == 0x2) { + /* move skb->data to current_tx_ptr payload */ + data = (u16 *)(skb->data) - 1; + *data = (u16)(skb->len); + current_tx_ptr->desc_a.start_addr = (u32)data; + /* this is important! */ + blackfin_dcache_flush_range((u32)data, + (u32)((u8 *)data + skb->len + 4)); + } else { + *((u16 *)(current_tx_ptr->packet)) = (u16)(skb->len); + memcpy((u8 *)(current_tx_ptr->packet + 2), skb->data, + skb->len); + current_tx_ptr->desc_a.start_addr = + (u32)current_tx_ptr->packet; + if (current_tx_ptr->status.status_word != 0) + current_tx_ptr->status.status_word = 0; + blackfin_dcache_flush_range( + (u32)current_tx_ptr->packet, + (u32)(current_tx_ptr->packet + skb->len + 2)); + } } else { - *((unsigned short *)(current_tx_ptr->packet)) = - (unsigned short)(skb->len); - memcpy((char *)(current_tx_ptr->packet + 2), skb->data, - (skb->len)); - current_tx_ptr->desc_a.start_addr = - (unsigned long)current_tx_ptr->packet; - if (current_tx_ptr->status.status_word != 0) - current_tx_ptr->status.status_word = 0; - blackfin_dcache_flush_range((unsigned int)current_tx_ptr-> - packet, - (unsigned int)(current_tx_ptr-> - packet + skb->len) + - 2); + /* + * TXDWA feature is avaible to revision < 0.3 silicon of + * BF537 and always avaible to BF52x + */ + u32 data_align = (u32)(skb->data) & 0x3; + if (data_align == 0x0) { + u16 sysctl = bfin_read_EMAC_SYSCTL(); + sysctl |= TXDWA; + bfin_write_EMAC_SYSCTL(sysctl); + + /* move skb->data to current_tx_ptr payload */ + data = (u16 *)(skb->data) - 2; + *data = (u16)(skb->len); + current_tx_ptr->desc_a.start_addr = (u32)data; + /* this is important! */ + blackfin_dcache_flush_range( + (u32)data, + (u32)((u8 *)data + skb->len + 4)); + } else if (data_align == 0x2) { + u16 sysctl = bfin_read_EMAC_SYSCTL(); + sysctl &= ~TXDWA; + bfin_write_EMAC_SYSCTL(sysctl); + + /* move skb->data to current_tx_ptr payload */ + data = (u16 *)(skb->data) - 1; + *data = (u16)(skb->len); + current_tx_ptr->desc_a.start_addr = (u32)data; + /* this is important! */ + blackfin_dcache_flush_range( + (u32)data, + (u32)((u8 *)data + skb->len + 4)); + } else { + u16 sysctl = bfin_read_EMAC_SYSCTL(); + sysctl &= ~TXDWA; + bfin_write_EMAC_SYSCTL(sysctl); + + *((u16 *)(current_tx_ptr->packet)) = (u16)(skb->len); + memcpy((u8 *)(current_tx_ptr->packet + 2), skb->data, + skb->len); + current_tx_ptr->desc_a.start_addr = + (u32)current_tx_ptr->packet; + if (current_tx_ptr->status.status_word != 0) + current_tx_ptr->status.status_word = 0; + blackfin_dcache_flush_range( + (u32)current_tx_ptr->packet, + (u32)(current_tx_ptr->packet + skb->len + 2)); + } } /* enable this packet's dma */
--
1.5.6
From: Bryan Wu <cooloney@kernel.org>
Date: 2008-07-27 14:46:31
From: Michael Hennerich <michael.hennerich@analog.com> Reprogram MAC address after resume from Suspend Mem (Blackfin Hibernate looses all CORE and SYSTEM register content) Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> Signed-off-by: Bryan Wu <cooloney@kernel.org> --- drivers/net/bfin_mac.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c
index 57ebe6d..69a6b9d 100644
--- a/drivers/net/bfin_mac.c
+++ b/drivers/net/bfin_mac.c@@ -972,6 +972,7 @@ static int bfin_mac_open(struct net_device *dev) phy_start(lp->phydev); phy_write(lp->phydev, MII_BMCR, BMCR_RESET); setup_system_regs(dev); + setup_mac_addr(dev->dev_addr); bfin_mac_disable(); bfin_mac_enable(); pr_debug("hardware init finished\n");
--
1.5.6
From: Paulius Zaleckas <hidden>
Date: 2008-07-28 15:25:20
Bryan Wu wrote:
From: Mike Frysinger <redacted> Signed-off-by: Mike Frysinger <redacted> Signed-off-by: Bryan Wu <cooloney@kernel.org> --- drivers/net/bfin_mac.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index 4144343..17951cb 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c@@ -956,7 +956,7 @@ static int bfin_mac_close(struct net_device *dev) return 0; } -static int __init bfin_mac_probe(struct platform_device *pdev) +static int __devinit bfin_mac_probe(struct platform_device *pdev)
__init was OK here. __devinit is for hotplug devices
{ struct net_device *ndev; struct bfin_mac_local *lp;@@ -1082,7 +1082,7 @@ out_err_probe_mac: return rc; } -static int bfin_mac_remove(struct platform_device *pdev) +static int __devexit bfin_mac_remove(struct platform_device *pdev)
__devexit is for hotplug, use __exit
{ struct net_device *ndev = platform_get_drvdata(pdev); struct bfin_mac_local *lp = netdev_priv(ndev);@@ -1129,7 +1129,7 @@ static int bfin_mac_resume(struct platform_device *pdev) static struct platform_driver bfin_mac_driver = { .probe = bfin_mac_probe,
.probe shouldn't be declared here. And you should use platform_device_probe() instead of platform_device_add()
- .remove = bfin_mac_remove, + .remove = __devexit_p(bfin_mac_remove),
should be __exit_p()
.resume = bfin_mac_resume,
.suspend = bfin_mac_suspend,
.driver = {
From: Bryan Wu <cooloney@kernel.org>
Date: 2008-07-29 03:35:16
On Mon, Jul 28, 2008 at 11:21 PM, Paulius Zaleckas [off-list ref] wrote:
Bryan Wu wrote:quoted
From: Mike Frysinger <redacted> Signed-off-by: Mike Frysinger <redacted> Signed-off-by: Bryan Wu <cooloney@kernel.org> --- drivers/net/bfin_mac.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index 4144343..17951cb 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c@@ -956,7 +956,7 @@ static int bfin_mac_close(struct net_device *dev) return 0; } -static int __init bfin_mac_probe(struct platform_device *pdev) +static int __devinit bfin_mac_probe(struct platform_device *pdev)__init was OK here. __devinit is for hotplug devicesquoted
{ struct net_device *ndev; struct bfin_mac_local *lp;@@ -1082,7 +1082,7 @@ out_err_probe_mac: return rc; } -static int bfin_mac_remove(struct platform_device *pdev) +static int __devexit bfin_mac_remove(struct platform_device *pdev)__devexit is for hotplug, use __exitquoted
{ struct net_device *ndev = platform_get_drvdata(pdev); struct bfin_mac_local *lp = netdev_priv(ndev);@@ -1129,7 +1129,7 @@ static int bfin_mac_resume(struct platform_device*pdev) static struct platform_driver bfin_mac_driver = {
I failed to find platform_device_probe. Could you please provide some info? .probe and .remove is very common in platform driver interface, isn't? I don't know any difference between platform_device_probe() and platform_device_add(). Thanks -Bryan
quoted
- .remove = bfin_mac_remove, + .remove = __devexit_p(bfin_mac_remove),should be __exit_p()quoted
.resume = bfin_mac_resume, .suspend = bfin_mac_suspend, .driver = {-- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Jeff Garzik <hidden>
Date: 2008-07-29 21:49:57
Bryan Wu wrote:
From: Mike Frysinger <redacted> Signed-off-by: Mike Frysinger <redacted> Signed-off-by: Bryan Wu <cooloney@kernel.org> --- drivers/net/bfin_mac.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
applied 1-3