* [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC @ 2010-02-17 14:55 Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 1/3] fs_enet: use dev_xxx instead of printk Anatolij Gustschin 2010-02-22 11:37 ` [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC Anatolij Gustschin 0 siblings, 2 replies; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-17 14:55 UTC (permalink / raw) To: netdev Cc: Wolfgang Denk, Detlev Zundel, linuxppc-dev, Anatolij Gustschin, David S. Miller These patches attempt to provide support for the Freescale MPC512x FEC in the fs_enet driver. The first cleanup patch replaces printk by dev_xxx. The second and third attemt to support MPC5121 FEC in the FEC driver. Changes since previous version: - don't attempt to provide runtime selection of MPC5121 FEC support in the driver since it doesn't make sence. Select MPC5121 FEC support at compile time. - fix tx buffer alignment workaround patch to align only misaligned buffers. The patches are based on net-next-2.6 and has been tested on the: - Freescale/STX "MPC5121ADS" board (board rev. 4) with a MPC5121e Rev. 2. - TQM860L and TQM855 boards. Anatolij Gustschin (3): fs_enet: use dev_xxx instead of printk fs_enet: Add support for MPC512x to fs_enet driver fs_enet: add FEC TX buffer alignment workaround for MPC5121 drivers/net/fs_enet/Kconfig | 10 +++- drivers/net/fs_enet/fs_enet-main.c | 90 ++++++++++++++++++++++++++---------- drivers/net/fs_enet/fs_enet.h | 49 +++++++++++++++++++- drivers/net/fs_enet/mac-fcc.c | 5 +- drivers/net/fs_enet/mac-fec.c | 58 ++++++++++++++--------- drivers/net/fs_enet/mac-scc.c | 9 ++-- drivers/net/fs_enet/mii-fec.c | 4 +- 7 files changed, 166 insertions(+), 59 deletions(-) ^ permalink raw reply [flat|nested] 13+ messages in thread
* [net-next-2.6 PATCH v2 1/3] fs_enet: use dev_xxx instead of printk 2010-02-17 14:55 [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC Anatolij Gustschin @ 2010-02-17 14:55 ` Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver Anatolij Gustschin 2010-02-22 11:37 ` [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC Anatolij Gustschin 1 sibling, 1 reply; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-17 14:55 UTC (permalink / raw) To: netdev Cc: Wolfgang Denk, Detlev Zundel, linuxppc-dev, Anatolij Gustschin, David S. Miller Signed-off-by: Anatolij Gustschin <agust@denx.de> Acked-by: Grant Likely <grant.likely@secretlab.ca> --- drivers/net/fs_enet/fs_enet-main.c | 39 +++++++++++++---------------------- drivers/net/fs_enet/mac-fcc.c | 5 ++- drivers/net/fs_enet/mac-fec.c | 12 ++++------ drivers/net/fs_enet/mac-scc.c | 9 +++---- 4 files changed, 27 insertions(+), 38 deletions(-) diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index ec2f503..c34a7e0 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -108,9 +108,7 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget) * the last indicator should be set. */ if ((sc & BD_ENET_RX_LAST) == 0) - printk(KERN_WARNING DRV_MODULE_NAME - ": %s rcv is not +last\n", - dev->name); + dev_warn(fep->dev, "rcv is not +last\n"); /* * Check for errors. @@ -178,9 +176,8 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget) received++; netif_receive_skb(skb); } else { - printk(KERN_WARNING DRV_MODULE_NAME - ": %s Memory squeeze, dropping packet.\n", - dev->name); + dev_warn(fep->dev, + "Memory squeeze, dropping packet.\n"); fep->stats.rx_dropped++; skbn = skb; } @@ -242,9 +239,7 @@ static int fs_enet_rx_non_napi(struct net_device *dev) * the last indicator should be set. */ if ((sc & BD_ENET_RX_LAST) == 0) - printk(KERN_WARNING DRV_MODULE_NAME - ": %s rcv is not +last\n", - dev->name); + dev_warn(fep->dev, "rcv is not +last\n"); /* * Check for errors. @@ -313,9 +308,8 @@ static int fs_enet_rx_non_napi(struct net_device *dev) received++; netif_rx(skb); } else { - printk(KERN_WARNING DRV_MODULE_NAME - ": %s Memory squeeze, dropping packet.\n", - dev->name); + dev_warn(fep->dev, + "Memory squeeze, dropping packet.\n"); fep->stats.rx_dropped++; skbn = skb; } @@ -388,10 +382,10 @@ static void fs_enet_tx(struct net_device *dev) } else fep->stats.tx_packets++; - if (sc & BD_ENET_TX_READY) - printk(KERN_WARNING DRV_MODULE_NAME - ": %s HEY! Enet xmit interrupt and TX_READY.\n", - dev->name); + if (sc & BD_ENET_TX_READY) { + dev_warn(fep->dev, + "HEY! Enet xmit interrupt and TX_READY.\n"); + } /* * Deferred means some collisions occurred during transmit, @@ -511,9 +505,8 @@ void fs_init_bds(struct net_device *dev) for (i = 0, bdp = fep->rx_bd_base; i < fep->rx_ring; i++, bdp++) { skb = dev_alloc_skb(ENET_RX_FRSIZE); if (skb == NULL) { - printk(KERN_WARNING DRV_MODULE_NAME - ": %s Memory squeeze, unable to allocate skb\n", - dev->name); + dev_warn(fep->dev, + "Memory squeeze, unable to allocate skb\n"); break; } skb_align(skb, ENET_RX_ALIGN); @@ -610,8 +603,7 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) * Ooops. All transmit buffers are full. Bail out. * This should not happen, since the tx queue should be stopped. */ - printk(KERN_WARNING DRV_MODULE_NAME - ": %s tx queue full!.\n", dev->name); + dev_warn(fep->dev, "tx queue full!.\n"); return NETDEV_TX_BUSY; } @@ -788,8 +780,7 @@ static int fs_enet_open(struct net_device *dev) r = request_irq(fep->interrupt, fs_enet_interrupt, IRQF_SHARED, "fs_enet-mac", dev); if (r != 0) { - printk(KERN_ERR DRV_MODULE_NAME - ": %s Could not allocate FS_ENET IRQ!", dev->name); + dev_err(fep->dev, "Could not allocate FS_ENET IRQ!"); if (fep->fpi->use_napi) napi_disable(&fep->napi); return -EINVAL; @@ -1053,7 +1044,7 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, if (ret) goto out_free_bd; - printk(KERN_INFO "%s: fs_enet: %pM\n", ndev->name, ndev->dev_addr); + pr_info("%s: fs_enet: %pM\n", ndev->name, ndev->dev_addr); return 0; diff --git a/drivers/net/fs_enet/mac-fcc.c b/drivers/net/fs_enet/mac-fcc.c index 482f27d..504add3 100644 --- a/drivers/net/fs_enet/mac-fcc.c +++ b/drivers/net/fs_enet/mac-fcc.c @@ -476,8 +476,9 @@ static void clear_int_events(struct net_device *dev, u32 int_events) static void ev_error(struct net_device *dev, u32 int_events) { - printk(KERN_WARNING DRV_MODULE_NAME - ": %s FS_ENET ERROR(s) 0x%x\n", dev->name, int_events); + struct fs_enet_private *fep = netdev_priv(dev); + + dev_warn(fep->dev, "FS_ENET ERROR(s) 0x%x\n", int_events); } static int get_regs(struct net_device *dev, void *p, int *sizep) diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c index ddf13ef..7047813 100644 --- a/drivers/net/fs_enet/mac-fec.c +++ b/drivers/net/fs_enet/mac-fec.c @@ -257,8 +257,7 @@ static void restart(struct net_device *dev) r = whack_reset(fep->fec.fecp); if (r != 0) - printk(KERN_ERR DRV_MODULE_NAME - ": %s FEC Reset FAILED!\n", dev->name); + dev_err(fep->dev, "FEC Reset FAILED!\n"); /* * Set station address. */ @@ -355,9 +354,7 @@ static void stop(struct net_device *dev) udelay(1); if (i == FEC_RESET_DELAY) - printk(KERN_WARNING DRV_MODULE_NAME - ": %s FEC timeout on graceful transmit stop\n", - dev->name); + dev_warn(fep->dev, "FEC timeout on graceful transmit stop\n"); /* * Disable FEC. Let only MII interrupts. */ @@ -433,8 +430,9 @@ static void clear_int_events(struct net_device *dev, u32 int_events) static void ev_error(struct net_device *dev, u32 int_events) { - printk(KERN_WARNING DRV_MODULE_NAME - ": %s FEC ERROR(s) 0x%x\n", dev->name, int_events); + struct fs_enet_private *fep = netdev_priv(dev); + + dev_warn(fep->dev, "FEC ERROR(s) 0x%x\n", int_events); } static int get_regs(struct net_device *dev, void *p, int *sizep) diff --git a/drivers/net/fs_enet/mac-scc.c b/drivers/net/fs_enet/mac-scc.c index 141dbc9..ff467e4 100644 --- a/drivers/net/fs_enet/mac-scc.c +++ b/drivers/net/fs_enet/mac-scc.c @@ -367,9 +367,7 @@ static void stop(struct net_device *dev) udelay(1); if (i == SCC_RESET_DELAY) - printk(KERN_WARNING DRV_MODULE_NAME - ": %s SCC timeout on graceful transmit stop\n", - dev->name); + dev_warn(fep->dev, "SCC timeout on graceful transmit stop\n"); W16(sccp, scc_sccm, 0); C32(sccp, scc_gsmrl, SCC_GSMRL_ENR | SCC_GSMRL_ENT); @@ -429,8 +427,9 @@ static void clear_int_events(struct net_device *dev, u32 int_events) static void ev_error(struct net_device *dev, u32 int_events) { - printk(KERN_WARNING DRV_MODULE_NAME - ": %s SCC ERROR(s) 0x%x\n", dev->name, int_events); + struct fs_enet_private *fep = netdev_priv(dev); + + dev_warn(fep->dev, "SCC ERROR(s) 0x%x\n", int_events); } static int get_regs(struct net_device *dev, void *p, int *sizep) -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 1/3] fs_enet: use dev_xxx instead of printk Anatolij Gustschin @ 2010-02-17 14:55 ` Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 Anatolij Gustschin 2010-02-17 15:11 ` [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver Grant Likely 0 siblings, 2 replies; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-17 14:55 UTC (permalink / raw) To: netdev Cc: Wolfgang Denk, Detlev Zundel, linuxppc-dev, Anatolij Gustschin, David S. Miller, Piotr Ziecik Extend the fs_enet driver to support MPC512x FEC. Enable it with CONFIG_FS_ENET_MPC5121_FEC option. Signed-off-by: John Rigby <jcrigby@gmail.com> Signed-off-by: Piotr Ziecik <kosmo@semihalf.com> Signed-off-by: Wolfgang Denk <wd@denx.de> Signed-off-by: Anatolij Gustschin <agust@denx.de> --- drivers/net/fs_enet/Kconfig | 10 +++++-- drivers/net/fs_enet/fs_enet-main.c | 7 +++++ drivers/net/fs_enet/fs_enet.h | 49 +++++++++++++++++++++++++++++++++++- drivers/net/fs_enet/mac-fec.c | 46 ++++++++++++++++++++++----------- drivers/net/fs_enet/mii-fec.c | 4 +- 5 files changed, 95 insertions(+), 21 deletions(-) diff --git a/drivers/net/fs_enet/Kconfig b/drivers/net/fs_enet/Kconfig index 562ea68..fc073b5 100644 --- a/drivers/net/fs_enet/Kconfig +++ b/drivers/net/fs_enet/Kconfig @@ -1,9 +1,13 @@ config FS_ENET tristate "Freescale Ethernet Driver" - depends on CPM1 || CPM2 + depends on CPM1 || CPM2 || PPC_MPC512x select MII select PHYLIB +config FS_ENET_MPC5121_FEC + def_bool y if (FS_ENET && PPC_MPC512x) + select FS_ENET_HAS_FEC + config FS_ENET_HAS_SCC bool "Chip has an SCC usable for ethernet" depends on FS_ENET && (CPM1 || CPM2) @@ -16,13 +20,13 @@ config FS_ENET_HAS_FCC config FS_ENET_HAS_FEC bool "Chip has an FEC usable for ethernet" - depends on FS_ENET && CPM1 + depends on FS_ENET && (CPM1 || FS_ENET_MPC5121_FEC) select FS_ENET_MDIO_FEC default y config FS_ENET_MDIO_FEC tristate "MDIO driver for FEC" - depends on FS_ENET && CPM1 + depends on FS_ENET && (CPM1 || FS_ENET_MPC5121_FEC) config FS_ENET_MDIO_FCC tristate "MDIO driver for FCC" diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index c34a7e0..4297021 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -1094,11 +1094,18 @@ static struct of_device_id fs_enet_match[] = { }, #endif #ifdef CONFIG_FS_ENET_HAS_FEC +#ifdef CONFIG_FS_ENET_MPC5121_FEC + { + .compatible = "fsl,mpc5121-fec", + .data = (void *)&fs_fec_ops, + }, +#else { .compatible = "fsl,pq1-fec-enet", .data = (void *)&fs_fec_ops, }, #endif +#endif {} }; MODULE_DEVICE_TABLE(of, fs_enet_match); diff --git a/drivers/net/fs_enet/fs_enet.h b/drivers/net/fs_enet/fs_enet.h index ef01e09..1ece4b1 100644 --- a/drivers/net/fs_enet/fs_enet.h +++ b/drivers/net/fs_enet/fs_enet.h @@ -13,9 +13,56 @@ #ifdef CONFIG_CPM1 #include <asm/cpm1.h> +#endif + +#if defined(CONFIG_FS_ENET_HAS_FEC) +#include <asm/cpm.h> + +#if defined(CONFIG_FS_ENET_MPC5121_FEC) +/* MPC5121 FEC has different register layout */ +struct fec { + u32 fec_reserved0; + u32 fec_ievent; /* Interrupt event reg */ + u32 fec_imask; /* Interrupt mask reg */ + u32 fec_reserved1; + u32 fec_r_des_active; /* Receive descriptor reg */ + u32 fec_x_des_active; /* Transmit descriptor reg */ + u32 fec_reserved2[3]; + u32 fec_ecntrl; /* Ethernet control reg */ + u32 fec_reserved3[6]; + u32 fec_mii_data; /* MII manage frame reg */ + u32 fec_mii_speed; /* MII speed control reg */ + u32 fec_reserved4[7]; + u32 fec_mib_ctrlstat; /* MIB control/status reg */ + u32 fec_reserved5[7]; + u32 fec_r_cntrl; /* Receive control reg */ + u32 fec_reserved6[15]; + u32 fec_x_cntrl; /* Transmit Control reg */ + u32 fec_reserved7[7]; + u32 fec_addr_low; /* Low 32bits MAC address */ + u32 fec_addr_high; /* High 16bits MAC address */ + u32 fec_opd; /* Opcode + Pause duration */ + u32 fec_reserved8[10]; + u32 fec_hash_table_high; /* High 32bits hash table */ + u32 fec_hash_table_low; /* Low 32bits hash table */ + u32 fec_grp_hash_table_high; /* High 32bits hash table */ + u32 fec_grp_hash_table_low; /* Low 32bits hash table */ + u32 fec_reserved9[7]; + u32 fec_x_wmrk; /* FIFO transmit water mark */ + u32 fec_reserved10; + u32 fec_r_bound; /* FIFO receive bound reg */ + u32 fec_r_fstart; /* FIFO receive start reg */ + u32 fec_reserved11[11]; + u32 fec_r_des_start; /* Receive descriptor ring */ + u32 fec_x_des_start; /* Transmit descriptor ring */ + u32 fec_r_buff_size; /* Maximum receive buff size */ + u32 fec_reserved12[26]; + u32 fec_dma_control; /* DMA Endian and other ctrl */ +}; +#endif struct fec_info { - fec_t __iomem *fecp; + struct fec __iomem *fecp; u32 mii_speed; }; #endif diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c index 7047813..c9657da 100644 --- a/drivers/net/fs_enet/mac-fec.c +++ b/drivers/net/fs_enet/mac-fec.c @@ -80,7 +80,7 @@ */ #define FEC_RESET_DELAY 50 -static int whack_reset(fec_t __iomem *fecp) +static int whack_reset(struct fec __iomem *fecp) { int i; @@ -168,7 +168,7 @@ static void cleanup_data(struct net_device *dev) static void set_promiscuous_mode(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; FS(fecp, r_cntrl, FEC_RCNTRL_PROM); } @@ -216,7 +216,7 @@ static void set_multicast_one(struct net_device *dev, const u8 *mac) static void set_multicast_finish(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; /* if all multi or too many multicasts; just enable all */ if ((dev->flags & IFF_ALLMULTI) != 0 || @@ -246,7 +246,7 @@ static void set_multicast_list(struct net_device *dev) static void restart(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; const struct fs_platform_info *fpi = fep->fpi; dma_addr_t rx_bd_base_phys, tx_bd_base_phys; int r; @@ -280,7 +280,11 @@ static void restart(struct net_device *dev) * Set maximum receive buffer size. */ FW(fecp, r_buff_size, PKT_MAXBLR_SIZE); +#ifdef CONFIG_FS_ENET_MPC5121_FEC + FW(fecp, r_cntrl, PKT_MAXBUF_SIZE << 16); +#else FW(fecp, r_hash, PKT_MAXBUF_SIZE); +#endif /* get physical address */ rx_bd_base_phys = fep->ring_mem_addr; @@ -297,7 +301,11 @@ static void restart(struct net_device *dev) /* * Enable big endian and don't care about SDMA FC. */ +#ifdef CONFIG_FS_ENET_MPC5121_FEC + FS(fecp, dma_control, 0xC0000000); +#else FW(fecp, fun_code, 0x78000000); +#endif /* * Set MII speed. @@ -308,9 +316,17 @@ static void restart(struct net_device *dev) * Clear any outstanding interrupt. */ FW(fecp, ievent, 0xffc0); +#ifndef CONFIG_FS_ENET_MPC5121_FEC FW(fecp, ivec, (virq_to_hw(fep->interrupt) / 2) << 29); FW(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */ +#else + /* + * Only set MII mode - do not touch maximum frame length + * configured before. + */ + FS(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); +#endif /* * adjust to duplex mode */ @@ -339,7 +355,7 @@ static void stop(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); const struct fs_platform_info *fpi = fep->fpi; - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; struct fec_info* feci= fep->phydev->bus->priv; @@ -375,7 +391,7 @@ static void stop(struct net_device *dev) static void napi_clear_rx_event(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; FW(fecp, ievent, FEC_NAPI_RX_EVENT_MSK); } @@ -383,7 +399,7 @@ static void napi_clear_rx_event(struct net_device *dev) static void napi_enable_rx(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; FS(fecp, imask, FEC_NAPI_RX_EVENT_MSK); } @@ -391,7 +407,7 @@ static void napi_enable_rx(struct net_device *dev) static void napi_disable_rx(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; FC(fecp, imask, FEC_NAPI_RX_EVENT_MSK); } @@ -399,7 +415,7 @@ static void napi_disable_rx(struct net_device *dev) static void rx_bd_done(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; FW(fecp, r_des_active, 0x01000000); } @@ -407,7 +423,7 @@ static void rx_bd_done(struct net_device *dev) static void tx_kickstart(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; FW(fecp, x_des_active, 0x01000000); } @@ -415,7 +431,7 @@ static void tx_kickstart(struct net_device *dev) static u32 get_int_events(struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; return FR(fecp, ievent) & FR(fecp, imask); } @@ -423,7 +439,7 @@ static u32 get_int_events(struct net_device *dev) static void clear_int_events(struct net_device *dev, u32 int_events) { struct fs_enet_private *fep = netdev_priv(dev); - fec_t __iomem *fecp = fep->fec.fecp; + struct fec __iomem *fecp = fep->fec.fecp; FW(fecp, ievent, int_events); } @@ -439,17 +455,17 @@ static int get_regs(struct net_device *dev, void *p, int *sizep) { struct fs_enet_private *fep = netdev_priv(dev); - if (*sizep < sizeof(fec_t)) + if (*sizep < sizeof(struct fec)) return -EINVAL; - memcpy_fromio(p, fep->fec.fecp, sizeof(fec_t)); + memcpy_fromio(p, fep->fec.fecp, sizeof(struct fec)); return 0; } static int get_regs_len(struct net_device *dev) { - return sizeof(fec_t); + return sizeof(struct fec); } static void tx_restart(struct net_device *dev) diff --git a/drivers/net/fs_enet/mii-fec.c b/drivers/net/fs_enet/mii-fec.c index 96eba42..5944b65 100644 --- a/drivers/net/fs_enet/mii-fec.c +++ b/drivers/net/fs_enet/mii-fec.c @@ -52,7 +52,7 @@ static int fs_enet_fec_mii_read(struct mii_bus *bus , int phy_id, int location) { struct fec_info* fec = bus->priv; - fec_t __iomem *fecp = fec->fecp; + struct fec __iomem *fecp = fec->fecp; int i, ret = -1; BUG_ON((in_be32(&fecp->fec_r_cntrl) & FEC_RCNTRL_MII_MODE) == 0); @@ -75,7 +75,7 @@ static int fs_enet_fec_mii_read(struct mii_bus *bus , int phy_id, int location) static int fs_enet_fec_mii_write(struct mii_bus *bus, int phy_id, int location, u16 val) { struct fec_info* fec = bus->priv; - fec_t __iomem *fecp = fec->fecp; + struct fec __iomem *fecp = fec->fecp; int i; /* this must never happen */ -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver Anatolij Gustschin @ 2010-02-17 14:55 ` Anatolij Gustschin 2010-02-17 15:13 ` Grant Likely ` (2 more replies) 2010-02-17 15:11 ` [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver Grant Likely 1 sibling, 3 replies; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-17 14:55 UTC (permalink / raw) To: netdev Cc: Wolfgang Denk, Detlev Zundel, linuxppc-dev, Anatolij Gustschin, David S. Miller, Piotr Ziecik MPC5121 FEC requeries 4-byte alignmnent for TX data buffers. This patch is a work around that copies misaligned tx packets to an aligned skb before sending. Signed-off-by: John Rigby <jcrigby@gmail.com> Signed-off-by: Piotr Ziecik <kosmo@semihalf.com> Signed-off-by: Wolfgang Denk <wd@denx.de> Signed-off-by: Anatolij Gustschin <agust@denx.de> --- drivers/net/fs_enet/fs_enet-main.c | 44 ++++++++++++++++++++++++++++++++++++ 1 files changed, 44 insertions(+), 0 deletions(-) diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index 4297021..166a89d 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -580,6 +580,37 @@ void fs_cleanup_bds(struct net_device *dev) /**********************************************************************************/ +#ifdef CONFIG_FS_ENET_MPC5121_FEC +/* + * MPC5121 FEC requeries 4-byte alignment for TX data buffer! + */ +static struct sk_buff *tx_skb_align_workaround(struct net_device *dev, + struct sk_buff *skb) +{ + struct sk_buff *new_skb; + struct fs_enet_private *fep = netdev_priv(dev); + + /* Alloc new skb */ + new_skb = dev_alloc_skb(ENET_RX_FRSIZE + 4); + if (!new_skb) { + dev_warn(fep->dev, "Memory squeeze, dropping tx packet.\n"); + return NULL; + } + + /* Make sure new skb is properly aligned */ + skb_align(new_skb, 4); + + /* Copy data to new skb ... */ + skb_copy_from_linear_data(skb, new_skb->data, skb->len); + skb_put(new_skb, skb->len); + + /* ... and free an old one */ + dev_kfree_skb_any(skb); + + return new_skb; +} +#endif + static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); @@ -588,6 +619,19 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) u16 sc; unsigned long flags; +#ifdef CONFIG_FS_ENET_MPC5121_FEC + if (((unsigned long)skb->data) & 0x3) { + skb = tx_skb_align_workaround(dev, skb); + if (!skb) { + /* + * We have lost packet due to memory allocation error + * in tx_skb_align_workaround(). Hopefully original + * skb is still valid, so try transmit it later. + */ + return NETDEV_TX_BUSY; + } + } +#endif spin_lock_irqsave(&fep->tx_lock, flags); /* -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 Anatolij Gustschin @ 2010-02-17 15:13 ` Grant Likely 2010-02-17 15:17 ` Eric Dumazet 2010-02-17 22:08 ` [net-next-2.6 PATCH v3 " Anatolij Gustschin 2 siblings, 0 replies; 13+ messages in thread From: Grant Likely @ 2010-02-17 15:13 UTC (permalink / raw) To: Anatolij Gustschin Cc: Wolfgang Denk, Detlev Zundel, netdev, linuxppc-dev, David S. Miller, Piotr Ziecik On Wed, Feb 17, 2010 at 7:55 AM, Anatolij Gustschin <agust@denx.de> wrote: > MPC5121 FEC requeries 4-byte alignmnent for TX data buffers. > This patch is a work around that copies misaligned tx packets > to an aligned skb before sending. > > Signed-off-by: John Rigby <jcrigby@gmail.com> > Signed-off-by: Piotr Ziecik <kosmo@semihalf.com> > Signed-off-by: Wolfgang Denk <wd@denx.de> > Signed-off-by: Anatolij Gustschin <agust@denx.de> Acked-by: Grant Likely <grant.likely@secretlab.ca> > --- > =A0drivers/net/fs_enet/fs_enet-main.c | =A0 44 ++++++++++++++++++++++++++= ++++++++++ > =A01 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_= enet-main.c > index 4297021..166a89d 100644 > --- a/drivers/net/fs_enet/fs_enet-main.c > +++ b/drivers/net/fs_enet/fs_enet-main.c > @@ -580,6 +580,37 @@ void fs_cleanup_bds(struct net_device *dev) > > =A0/*********************************************************************= *************/ > > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > +/* > + * MPC5121 FEC requeries 4-byte alignment for TX data buffer! > + */ > +static struct sk_buff *tx_skb_align_workaround(struct net_device *dev, > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 =A0struct sk_buff *skb) > +{ > + =A0 =A0 =A0 struct sk_buff *new_skb; > + =A0 =A0 =A0 struct fs_enet_private *fep =3D netdev_priv(dev); > + > + =A0 =A0 =A0 /* Alloc new skb */ > + =A0 =A0 =A0 new_skb =3D dev_alloc_skb(ENET_RX_FRSIZE + 4); > + =A0 =A0 =A0 if (!new_skb) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 dev_warn(fep->dev, "Memory squeeze, droppin= g tx packet.\n"); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 return NULL; > + =A0 =A0 =A0 } > + > + =A0 =A0 =A0 /* Make sure new skb is properly aligned */ > + =A0 =A0 =A0 skb_align(new_skb, 4); > + > + =A0 =A0 =A0 /* Copy data to new skb ... */ > + =A0 =A0 =A0 skb_copy_from_linear_data(skb, new_skb->data, skb->len); > + =A0 =A0 =A0 skb_put(new_skb, skb->len); > + > + =A0 =A0 =A0 /* ... and free an old one */ > + =A0 =A0 =A0 dev_kfree_skb_any(skb); > + > + =A0 =A0 =A0 return new_skb; > +} > +#endif > + > =A0static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *= dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > @@ -588,6 +619,19 @@ static int fs_enet_start_xmit(struct sk_buff *skb, s= truct net_device *dev) > =A0 =A0 =A0 =A0u16 sc; > =A0 =A0 =A0 =A0unsigned long flags; > > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > + =A0 =A0 =A0 if (((unsigned long)skb->data) & 0x3) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 skb =3D tx_skb_align_workaround(dev, skb); > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (!skb) { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* We have lost packet du= e to memory allocation error > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* in tx_skb_align_workar= ound(). Hopefully original > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0* skb is still valid, so= try transmit it later. > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0*/ > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 return NETDEV_TX_BUSY; > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 } > + =A0 =A0 =A0 } > +#endif Instead of > =A0 =A0 =A0 =A0spin_lock_irqsave(&fep->tx_lock, flags); > > =A0 =A0 =A0 =A0/* > -- > 1.6.3.3 > > --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 Anatolij Gustschin 2010-02-17 15:13 ` Grant Likely @ 2010-02-17 15:17 ` Eric Dumazet 2010-02-17 21:31 ` Anatolij Gustschin 2010-02-17 22:08 ` [net-next-2.6 PATCH v3 " Anatolij Gustschin 2 siblings, 1 reply; 13+ messages in thread From: Eric Dumazet @ 2010-02-17 15:17 UTC (permalink / raw) To: Anatolij Gustschin Cc: Wolfgang Denk, Detlev Zundel, netdev, linuxppc-dev, David S. Miller, Piotr Ziecik Le mercredi 17 février 2010 à 15:55 +0100, Anatolij Gustschin a écrit : > MPC5121 FEC requeries 4-byte alignmnent for TX data buffers. > This patch is a work around that copies misaligned tx packets > to an aligned skb before sending. > > Signed-off-by: John Rigby <jcrigby@gmail.com> > Signed-off-by: Piotr Ziecik <kosmo@semihalf.com> > Signed-off-by: Wolfgang Denk <wd@denx.de> > Signed-off-by: Anatolij Gustschin <agust@denx.de> > --- > drivers/net/fs_enet/fs_enet-main.c | 44 ++++++++++++++++++++++++++++++++++++ > 1 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c > index 4297021..166a89d 100644 > --- a/drivers/net/fs_enet/fs_enet-main.c > +++ b/drivers/net/fs_enet/fs_enet-main.c > @@ -580,6 +580,37 @@ void fs_cleanup_bds(struct net_device *dev) > > /**********************************************************************************/ > > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > +/* > + * MPC5121 FEC requeries 4-byte alignment for TX data buffer! > + */ > +static struct sk_buff *tx_skb_align_workaround(struct net_device *dev, > + struct sk_buff *skb) > +{ > + struct sk_buff *new_skb; > + struct fs_enet_private *fep = netdev_priv(dev); > + > + /* Alloc new skb */ > + new_skb = dev_alloc_skb(ENET_RX_FRSIZE + 4); ENET_RX_FRSIZE looks strange in TX path Why not using skb->len + 4 instead of ENET_RX_FRSIZE + 4 ? > + if (!new_skb) { > + dev_warn(fep->dev, "Memory squeeze, dropping tx packet.\n"); I am just wondering if this is ratelimited ? > + return NULL; > + } > + > + /* Make sure new skb is properly aligned */ > + skb_align(new_skb, 4); > + > + /* Copy data to new skb ... */ > + skb_copy_from_linear_data(skb, new_skb->data, skb->len); > + skb_put(new_skb, skb->len); > + > + /* ... and free an old one */ > + dev_kfree_skb_any(skb); > + > + return new_skb; > +} > +#endif > + > static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) > { > struct fs_enet_private *fep = netdev_priv(dev); > @@ -588,6 +619,19 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) > u16 sc; > unsigned long flags; > > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > + if (((unsigned long)skb->data) & 0x3) { > + skb = tx_skb_align_workaround(dev, skb); > + if (!skb) { > + /* > + * We have lost packet due to memory allocation error > + * in tx_skb_align_workaround(). Hopefully original > + * skb is still valid, so try transmit it later. > + */ Could you define 'try to transmit later' ? Who is responsible to trigger this event ? > + return NETDEV_TX_BUSY; > + } > + } > +#endif > spin_lock_irqsave(&fep->tx_lock, flags); > > /* ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 2010-02-17 15:17 ` Eric Dumazet @ 2010-02-17 21:31 ` Anatolij Gustschin 0 siblings, 0 replies; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-17 21:31 UTC (permalink / raw) To: Eric Dumazet Cc: Wolfgang Denk, Detlev Zundel, netdev, linuxppc-dev, David S. Miller, Piotr Ziecik On Wed, 17 Feb 2010 16:17:16 +0100 Eric Dumazet <eric.dumazet@gmail.com> wrote: > Le mercredi 17 f=C3=A9vrier 2010 =C3=A0 15:55 +0100, Anatolij Gustschin a= =C3=A9crit : ... > > +static struct sk_buff *tx_skb_align_workaround(struct net_device *dev, > > + struct sk_buff *skb) > > +{ > > + struct sk_buff *new_skb; > > + struct fs_enet_private *fep =3D netdev_priv(dev); > > + > > + /* Alloc new skb */ > > + new_skb =3D dev_alloc_skb(ENET_RX_FRSIZE + 4); >=20 >=20 > ENET_RX_FRSIZE looks strange in TX path >=20 > Why not using skb->len + 4 instead of ENET_RX_FRSIZE + 4 ? I will fix it. > > + if (!new_skb) { > > + dev_warn(fep->dev, "Memory squeeze, dropping tx packet.\n"); >=20 > I am just wondering if this is ratelimited ? Right, it should be ratelimited, will fix it, too. ... > > static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *= dev) > > { > > struct fs_enet_private *fep =3D netdev_priv(dev); > > @@ -588,6 +619,19 @@ static int fs_enet_start_xmit(struct sk_buff *skb,= struct net_device *dev) > > u16 sc; > > unsigned long flags; > > =20 > > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > > + if (((unsigned long)skb->data) & 0x3) { > > + skb =3D tx_skb_align_workaround(dev, skb); > > + if (!skb) { > > + /* > > + * We have lost packet due to memory allocation error > > + * in tx_skb_align_workaround(). Hopefully original > > + * skb is still valid, so try transmit it later. > > + */ >=20 > Could you define 'try to transmit later' ? > Who is responsible to trigger this event ? The function returns NETDEV_TX_BUSY here, skb is not consumed and will be requeued by sch_direct_xmit(), so it is scheduled for resending later. Thanks, Anatolij ^ permalink raw reply [flat|nested] 13+ messages in thread
* [net-next-2.6 PATCH v3 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 Anatolij Gustschin 2010-02-17 15:13 ` Grant Likely 2010-02-17 15:17 ` Eric Dumazet @ 2010-02-17 22:08 ` Anatolij Gustschin 2 siblings, 0 replies; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-17 22:08 UTC (permalink / raw) To: netdev Cc: Wolfgang Denk, Detlev Zundel, linuxppc-dev, Anatolij Gustschin, David S. Miller, Piotr Ziecik MPC5121 FEC requeries 4-byte alignmnent for TX data buffers. This patch is a work around that copies misaligned tx packets to an aligned skb before sending. Signed-off-by: John Rigby <jcrigby@gmail.com> Signed-off-by: Piotr Ziecik <kosmo@semihalf.com> Signed-off-by: Wolfgang Denk <wd@denx.de> Signed-off-by: Anatolij Gustschin <agust@denx.de> --- Changes since v2: - ratelimit warning message - use skb->len + 4 as size for allocation of the new skb with aligned buffer. drivers/net/fs_enet/fs_enet-main.c | 47 ++++++++++++++++++++++++++++++++++++ 1 files changed, 47 insertions(+), 0 deletions(-) diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_enet-main.c index 4297021..0770e2f 100644 --- a/drivers/net/fs_enet/fs_enet-main.c +++ b/drivers/net/fs_enet/fs_enet-main.c @@ -580,6 +580,40 @@ void fs_cleanup_bds(struct net_device *dev) /**********************************************************************************/ +#ifdef CONFIG_FS_ENET_MPC5121_FEC +/* + * MPC5121 FEC requeries 4-byte alignment for TX data buffer! + */ +static struct sk_buff *tx_skb_align_workaround(struct net_device *dev, + struct sk_buff *skb) +{ + struct sk_buff *new_skb; + struct fs_enet_private *fep = netdev_priv(dev); + + /* Alloc new skb */ + new_skb = dev_alloc_skb(skb->len + 4); + if (!new_skb) { + if (net_ratelimit()) { + dev_warn(fep->dev, + "Memory squeeze, dropping tx packet.\n"); + } + return NULL; + } + + /* Make sure new skb is properly aligned */ + skb_align(new_skb, 4); + + /* Copy data to new skb ... */ + skb_copy_from_linear_data(skb, new_skb->data, skb->len); + skb_put(new_skb, skb->len); + + /* ... and free an old one */ + dev_kfree_skb_any(skb); + + return new_skb; +} +#endif + static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) { struct fs_enet_private *fep = netdev_priv(dev); @@ -588,6 +622,19 @@ static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev) u16 sc; unsigned long flags; +#ifdef CONFIG_FS_ENET_MPC5121_FEC + if (((unsigned long)skb->data) & 0x3) { + skb = tx_skb_align_workaround(dev, skb); + if (!skb) { + /* + * We have lost packet due to memory allocation error + * in tx_skb_align_workaround(). Hopefully original + * skb is still valid, so try transmit it later. + */ + return NETDEV_TX_BUSY; + } + } +#endif spin_lock_irqsave(&fep->tx_lock, flags); /* -- 1.6.3.3 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 Anatolij Gustschin @ 2010-02-17 15:11 ` Grant Likely 1 sibling, 0 replies; 13+ messages in thread From: Grant Likely @ 2010-02-17 15:11 UTC (permalink / raw) To: Anatolij Gustschin Cc: Wolfgang Denk, Detlev Zundel, netdev, linuxppc-dev, David S. Miller, Piotr Ziecik On Wed, Feb 17, 2010 at 7:55 AM, Anatolij Gustschin <agust@denx.de> wrote: > Extend the fs_enet driver to support MPC512x FEC. > Enable it with CONFIG_FS_ENET_MPC5121_FEC option. > > Signed-off-by: John Rigby <jcrigby@gmail.com> > Signed-off-by: Piotr Ziecik <kosmo@semihalf.com> > Signed-off-by: Wolfgang Denk <wd@denx.de> > Signed-off-by: Anatolij Gustschin <agust@denx.de> Looks sane to me. Acked-by: Grant Likely <grant.likely@secretlab.ca> > --- > =A0drivers/net/fs_enet/Kconfig =A0 =A0 =A0 =A0| =A0 10 +++++-- > =A0drivers/net/fs_enet/fs_enet-main.c | =A0 =A07 +++++ > =A0drivers/net/fs_enet/fs_enet.h =A0 =A0 =A0| =A0 49 ++++++++++++++++++++= +++++++++++++++- > =A0drivers/net/fs_enet/mac-fec.c =A0 =A0 =A0| =A0 46 ++++++++++++++++++++= ++----------- > =A0drivers/net/fs_enet/mii-fec.c =A0 =A0 =A0| =A0 =A04 +- > =A05 files changed, 95 insertions(+), 21 deletions(-) > > diff --git a/drivers/net/fs_enet/Kconfig b/drivers/net/fs_enet/Kconfig > index 562ea68..fc073b5 100644 > --- a/drivers/net/fs_enet/Kconfig > +++ b/drivers/net/fs_enet/Kconfig > @@ -1,9 +1,13 @@ > =A0config FS_ENET > =A0 =A0 =A0 =A0tristate "Freescale Ethernet Driver" > - =A0 =A0 =A0 depends on CPM1 || CPM2 > + =A0 =A0 =A0 depends on CPM1 || CPM2 || PPC_MPC512x > =A0 =A0 =A0 =A0select MII > =A0 =A0 =A0 =A0select PHYLIB > > +config FS_ENET_MPC5121_FEC > + =A0 =A0 =A0 def_bool y if (FS_ENET && PPC_MPC512x) > + =A0 =A0 =A0 select FS_ENET_HAS_FEC > + > =A0config FS_ENET_HAS_SCC > =A0 =A0 =A0 =A0bool "Chip has an SCC usable for ethernet" > =A0 =A0 =A0 =A0depends on FS_ENET && (CPM1 || CPM2) > @@ -16,13 +20,13 @@ config FS_ENET_HAS_FCC > > =A0config FS_ENET_HAS_FEC > =A0 =A0 =A0 =A0bool "Chip has an FEC usable for ethernet" > - =A0 =A0 =A0 depends on FS_ENET && CPM1 > + =A0 =A0 =A0 depends on FS_ENET && (CPM1 || FS_ENET_MPC5121_FEC) > =A0 =A0 =A0 =A0select FS_ENET_MDIO_FEC > =A0 =A0 =A0 =A0default y > > =A0config FS_ENET_MDIO_FEC > =A0 =A0 =A0 =A0tristate "MDIO driver for FEC" > - =A0 =A0 =A0 depends on FS_ENET && CPM1 > + =A0 =A0 =A0 depends on FS_ENET && (CPM1 || FS_ENET_MPC5121_FEC) > > =A0config FS_ENET_MDIO_FCC > =A0 =A0 =A0 =A0tristate "MDIO driver for FCC" > diff --git a/drivers/net/fs_enet/fs_enet-main.c b/drivers/net/fs_enet/fs_= enet-main.c > index c34a7e0..4297021 100644 > --- a/drivers/net/fs_enet/fs_enet-main.c > +++ b/drivers/net/fs_enet/fs_enet-main.c > @@ -1094,11 +1094,18 @@ static struct of_device_id fs_enet_match[] =3D { > =A0 =A0 =A0 =A0}, > =A0#endif > =A0#ifdef CONFIG_FS_ENET_HAS_FEC > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > + =A0 =A0 =A0 { > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .compatible =3D "fsl,mpc5121-fec", > + =A0 =A0 =A0 =A0 =A0 =A0 =A0 .data =3D (void *)&fs_fec_ops, > + =A0 =A0 =A0 }, > +#else > =A0 =A0 =A0 =A0{ > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.compatible =3D "fsl,pq1-fec-enet", > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0.data =3D (void *)&fs_fec_ops, > =A0 =A0 =A0 =A0}, > =A0#endif > +#endif > =A0 =A0 =A0 =A0{} > =A0}; > =A0MODULE_DEVICE_TABLE(of, fs_enet_match); > diff --git a/drivers/net/fs_enet/fs_enet.h b/drivers/net/fs_enet/fs_enet.= h > index ef01e09..1ece4b1 100644 > --- a/drivers/net/fs_enet/fs_enet.h > +++ b/drivers/net/fs_enet/fs_enet.h > @@ -13,9 +13,56 @@ > > =A0#ifdef CONFIG_CPM1 > =A0#include <asm/cpm1.h> > +#endif > + > +#if defined(CONFIG_FS_ENET_HAS_FEC) > +#include <asm/cpm.h> > + > +#if defined(CONFIG_FS_ENET_MPC5121_FEC) > +/* MPC5121 FEC has different register layout */ > +struct fec { > + =A0 =A0 =A0 u32 fec_reserved0; > + =A0 =A0 =A0 u32 fec_ievent; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Interrup= t event reg */ > + =A0 =A0 =A0 u32 fec_imask; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Interr= upt mask reg */ > + =A0 =A0 =A0 u32 fec_reserved1; > + =A0 =A0 =A0 u32 fec_r_des_active; =A0 =A0 =A0 =A0 =A0 /* Receive descri= ptor reg */ > + =A0 =A0 =A0 u32 fec_x_des_active; =A0 =A0 =A0 =A0 =A0 /* Transmit descr= iptor reg */ > + =A0 =A0 =A0 u32 fec_reserved2[3]; > + =A0 =A0 =A0 u32 fec_ecntrl; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Ethernet= control reg */ > + =A0 =A0 =A0 u32 fec_reserved3[6]; > + =A0 =A0 =A0 u32 fec_mii_data; =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* MII manage= frame reg */ > + =A0 =A0 =A0 u32 fec_mii_speed; =A0 =A0 =A0 =A0 =A0 =A0 =A0/* MII speed = control reg */ > + =A0 =A0 =A0 u32 fec_reserved4[7]; > + =A0 =A0 =A0 u32 fec_mib_ctrlstat; =A0 =A0 =A0 =A0 =A0 /* MIB control/st= atus reg */ > + =A0 =A0 =A0 u32 fec_reserved5[7]; > + =A0 =A0 =A0 u32 fec_r_cntrl; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Receive = control reg */ > + =A0 =A0 =A0 u32 fec_reserved6[15]; > + =A0 =A0 =A0 u32 fec_x_cntrl; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Transmit= Control reg */ > + =A0 =A0 =A0 u32 fec_reserved7[7]; > + =A0 =A0 =A0 u32 fec_addr_low; =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* Low 32bits= MAC address */ > + =A0 =A0 =A0 u32 fec_addr_high; =A0 =A0 =A0 =A0 =A0 =A0 =A0/* High 16bit= s MAC address */ > + =A0 =A0 =A0 u32 fec_opd; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* Opco= de + Pause duration */ > + =A0 =A0 =A0 u32 fec_reserved8[10]; > + =A0 =A0 =A0 u32 fec_hash_table_high; =A0 =A0 =A0 =A0/* High 32bits hash= table */ > + =A0 =A0 =A0 u32 fec_hash_table_low; =A0 =A0 =A0 =A0 /* Low 32bits hash = table */ > + =A0 =A0 =A0 u32 fec_grp_hash_table_high; =A0 =A0/* High 32bits hash tab= le */ > + =A0 =A0 =A0 u32 fec_grp_hash_table_low; =A0 =A0 /* Low 32bits hash tabl= e */ > + =A0 =A0 =A0 u32 fec_reserved9[7]; > + =A0 =A0 =A0 u32 fec_x_wmrk; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* FIFO tra= nsmit water mark */ > + =A0 =A0 =A0 u32 fec_reserved10; > + =A0 =A0 =A0 u32 fec_r_bound; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0/* FIFO rec= eive bound reg */ > + =A0 =A0 =A0 u32 fec_r_fstart; =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* FIFO recei= ve start reg */ > + =A0 =A0 =A0 u32 fec_reserved11[11]; > + =A0 =A0 =A0 u32 fec_r_des_start; =A0 =A0 =A0 =A0 =A0 =A0/* Receive desc= riptor ring */ > + =A0 =A0 =A0 u32 fec_x_des_start; =A0 =A0 =A0 =A0 =A0 =A0/* Transmit des= criptor ring */ > + =A0 =A0 =A0 u32 fec_r_buff_size; =A0 =A0 =A0 =A0 =A0 =A0/* Maximum rece= ive buff size */ > + =A0 =A0 =A0 u32 fec_reserved12[26]; > + =A0 =A0 =A0 u32 fec_dma_control; =A0 =A0 =A0 =A0 =A0 =A0/* DMA Endian a= nd other ctrl */ > +}; > +#endif > > =A0struct fec_info { > - =A0 =A0 =A0 fec_t __iomem *fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp; > =A0 =A0 =A0 =A0u32 mii_speed; > =A0}; > =A0#endif > diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.= c > index 7047813..c9657da 100644 > --- a/drivers/net/fs_enet/mac-fec.c > +++ b/drivers/net/fs_enet/mac-fec.c > @@ -80,7 +80,7 @@ > =A0*/ > =A0#define FEC_RESET_DELAY =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A050 > > -static int whack_reset(fec_t __iomem *fecp) > +static int whack_reset(struct fec __iomem *fecp) > =A0{ > =A0 =A0 =A0 =A0int i; > > @@ -168,7 +168,7 @@ static void cleanup_data(struct net_device *dev) > =A0static void set_promiscuous_mode(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0FS(fecp, r_cntrl, FEC_RCNTRL_PROM); > =A0} > @@ -216,7 +216,7 @@ static void set_multicast_one(struct net_device *dev,= const u8 *mac) > =A0static void set_multicast_finish(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0/* if all multi or too many multicasts; just enable all */ > =A0 =A0 =A0 =A0if ((dev->flags & IFF_ALLMULTI) !=3D 0 || > @@ -246,7 +246,7 @@ static void set_multicast_list(struct net_device *dev= ) > =A0static void restart(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > =A0 =A0 =A0 =A0const struct fs_platform_info *fpi =3D fep->fpi; > =A0 =A0 =A0 =A0dma_addr_t rx_bd_base_phys, tx_bd_base_phys; > =A0 =A0 =A0 =A0int r; > @@ -280,7 +280,11 @@ static void restart(struct net_device *dev) > =A0 =A0 =A0 =A0 * Set maximum receive buffer size. > =A0 =A0 =A0 =A0 */ > =A0 =A0 =A0 =A0FW(fecp, r_buff_size, PKT_MAXBLR_SIZE); > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > + =A0 =A0 =A0 FW(fecp, r_cntrl, PKT_MAXBUF_SIZE << 16); > +#else > =A0 =A0 =A0 =A0FW(fecp, r_hash, PKT_MAXBUF_SIZE); > +#endif > > =A0 =A0 =A0 =A0/* get physical address */ > =A0 =A0 =A0 =A0rx_bd_base_phys =3D fep->ring_mem_addr; > @@ -297,7 +301,11 @@ static void restart(struct net_device *dev) > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * Enable big endian and don't care about SDMA FC. > =A0 =A0 =A0 =A0 */ > +#ifdef CONFIG_FS_ENET_MPC5121_FEC > + =A0 =A0 =A0 FS(fecp, dma_control, 0xC0000000); > +#else > =A0 =A0 =A0 =A0FW(fecp, fun_code, 0x78000000); > +#endif > > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * Set MII speed. > @@ -308,9 +316,17 @@ static void restart(struct net_device *dev) > =A0 =A0 =A0 =A0 * Clear any outstanding interrupt. > =A0 =A0 =A0 =A0 */ > =A0 =A0 =A0 =A0FW(fecp, ievent, 0xffc0); > +#ifndef CONFIG_FS_ENET_MPC5121_FEC > =A0 =A0 =A0 =A0FW(fecp, ivec, (virq_to_hw(fep->interrupt) / 2) << 29); > > =A0 =A0 =A0 =A0FW(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */ > +#else > + =A0 =A0 =A0 /* > + =A0 =A0 =A0 =A0* Only set MII mode - do not touch maximum frame length > + =A0 =A0 =A0 =A0* configured before. > + =A0 =A0 =A0 =A0*/ > + =A0 =A0 =A0 FS(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); > +#endif > =A0 =A0 =A0 =A0/* > =A0 =A0 =A0 =A0 * adjust to duplex mode > =A0 =A0 =A0 =A0 */ > @@ -339,7 +355,7 @@ static void stop(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > =A0 =A0 =A0 =A0const struct fs_platform_info *fpi =3D fep->fpi; > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0struct fec_info* feci=3D fep->phydev->bus->priv; > > @@ -375,7 +391,7 @@ static void stop(struct net_device *dev) > =A0static void napi_clear_rx_event(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0FW(fecp, ievent, FEC_NAPI_RX_EVENT_MSK); > =A0} > @@ -383,7 +399,7 @@ static void napi_clear_rx_event(struct net_device *de= v) > =A0static void napi_enable_rx(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0FS(fecp, imask, FEC_NAPI_RX_EVENT_MSK); > =A0} > @@ -391,7 +407,7 @@ static void napi_enable_rx(struct net_device *dev) > =A0static void napi_disable_rx(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0FC(fecp, imask, FEC_NAPI_RX_EVENT_MSK); > =A0} > @@ -399,7 +415,7 @@ static void napi_disable_rx(struct net_device *dev) > =A0static void rx_bd_done(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0FW(fecp, r_des_active, 0x01000000); > =A0} > @@ -407,7 +423,7 @@ static void rx_bd_done(struct net_device *dev) > =A0static void tx_kickstart(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0FW(fecp, x_des_active, 0x01000000); > =A0} > @@ -415,7 +431,7 @@ static void tx_kickstart(struct net_device *dev) > =A0static u32 get_int_events(struct net_device *dev) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0return FR(fecp, ievent) & FR(fecp, imask); > =A0} > @@ -423,7 +439,7 @@ static u32 get_int_events(struct net_device *dev) > =A0static void clear_int_events(struct net_device *dev, u32 int_events) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fep->fec.fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fep->fec.fecp; > > =A0 =A0 =A0 =A0FW(fecp, ievent, int_events); > =A0} > @@ -439,17 +455,17 @@ static int get_regs(struct net_device *dev, void *p= , int *sizep) > =A0{ > =A0 =A0 =A0 =A0struct fs_enet_private *fep =3D netdev_priv(dev); > > - =A0 =A0 =A0 if (*sizep < sizeof(fec_t)) > + =A0 =A0 =A0 if (*sizep < sizeof(struct fec)) > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -EINVAL; > > - =A0 =A0 =A0 memcpy_fromio(p, fep->fec.fecp, sizeof(fec_t)); > + =A0 =A0 =A0 memcpy_fromio(p, fep->fec.fecp, sizeof(struct fec)); > > =A0 =A0 =A0 =A0return 0; > =A0} > > =A0static int get_regs_len(struct net_device *dev) > =A0{ > - =A0 =A0 =A0 return sizeof(fec_t); > + =A0 =A0 =A0 return sizeof(struct fec); > =A0} > > =A0static void tx_restart(struct net_device *dev) > diff --git a/drivers/net/fs_enet/mii-fec.c b/drivers/net/fs_enet/mii-fec.= c > index 96eba42..5944b65 100644 > --- a/drivers/net/fs_enet/mii-fec.c > +++ b/drivers/net/fs_enet/mii-fec.c > @@ -52,7 +52,7 @@ > =A0static int fs_enet_fec_mii_read(struct mii_bus *bus , int phy_id, int = location) > =A0{ > =A0 =A0 =A0 =A0struct fec_info* fec =3D bus->priv; > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fec->fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fec->fecp; > =A0 =A0 =A0 =A0int i, ret =3D -1; > > =A0 =A0 =A0 =A0BUG_ON((in_be32(&fecp->fec_r_cntrl) & FEC_RCNTRL_MII_MODE)= =3D=3D 0); > @@ -75,7 +75,7 @@ static int fs_enet_fec_mii_read(struct mii_bus *bus , i= nt phy_id, int location) > =A0static int fs_enet_fec_mii_write(struct mii_bus *bus, int phy_id, int = location, u16 val) > =A0{ > =A0 =A0 =A0 =A0struct fec_info* fec =3D bus->priv; > - =A0 =A0 =A0 fec_t __iomem *fecp =3D fec->fecp; > + =A0 =A0 =A0 struct fec __iomem *fecp =3D fec->fecp; > =A0 =A0 =A0 =A0int i; > > =A0 =A0 =A0 =A0/* this must never happen */ > -- > 1.6.3.3 > > --=20 Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC 2010-02-17 14:55 [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 1/3] fs_enet: use dev_xxx instead of printk Anatolij Gustschin @ 2010-02-22 11:37 ` Anatolij Gustschin 2010-02-22 11:44 ` David Miller 1 sibling, 1 reply; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-22 11:37 UTC (permalink / raw) To: David S. Miller; +Cc: Wolfgang Denk, Detlev Zundel, netdev, linuxppc-dev Hi David, On Wed, 17 Feb 2010 15:55:27 +0100 Anatolij Gustschin <agust@denx.de> wrote: > These patches attempt to provide support for the Freescale MPC512x > FEC in the fs_enet driver. The first cleanup patch replaces printk > by dev_xxx. The second and third attemt to support MPC5121 FEC > in the FEC driver. Could you please comment on this patch series. The patches have been acked by Grant and I slightly reworked third patch to address Eric's comments, so there is v3 for this patch now. Thanks, Anatolij ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC 2010-02-22 11:37 ` [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC Anatolij Gustschin @ 2010-02-22 11:44 ` David Miller 2010-02-26 20:18 ` Anatolij Gustschin 0 siblings, 1 reply; 13+ messages in thread From: David Miller @ 2010-02-22 11:44 UTC (permalink / raw) To: agust; +Cc: wd, dzu, netdev, linuxppc-dev From: Anatolij Gustschin <agust@denx.de> Date: Mon, 22 Feb 2010 12:37:24 +0100 > Could you please comment on this patch series. It's in the net-next-2.6 tree. If you need to make any more changes, they need to be relative to what went into my tree. ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC 2010-02-22 11:44 ` David Miller @ 2010-02-26 20:18 ` Anatolij Gustschin 2010-02-26 20:48 ` David Miller 0 siblings, 1 reply; 13+ messages in thread From: Anatolij Gustschin @ 2010-02-26 20:18 UTC (permalink / raw) To: David Miller; +Cc: wd, dzu, netdev, linuxppc-dev Hi David, On Mon, 22 Feb 2010 03:44:52 -0800 (PST) David Miller <davem@davemloft.net> wrote: > From: Anatolij Gustschin <agust@denx.de> > Date: Mon, 22 Feb 2010 12:37:24 +0100 > > > Could you please comment on this patch series. > > It's in the net-next-2.6 tree. > > If you need to make any more changes, they need to be relative > to what went into my tree. I've pulled your net-next-2.6 tree again and I don't see them in net-next-2.6 tree. Could you please check it again. Thanks! Anatolij ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC 2010-02-26 20:18 ` Anatolij Gustschin @ 2010-02-26 20:48 ` David Miller 0 siblings, 0 replies; 13+ messages in thread From: David Miller @ 2010-02-26 20:48 UTC (permalink / raw) To: agust; +Cc: wd, dzu, netdev, linuxppc-dev From: Anatolij Gustschin <agust@denx.de> Date: Fri, 26 Feb 2010 21:18:08 +0100 > Hi David, > > On Mon, 22 Feb 2010 03:44:52 -0800 (PST) > David Miller <davem@davemloft.net> wrote: > >> From: Anatolij Gustschin <agust@denx.de> >> Date: Mon, 22 Feb 2010 12:37:24 +0100 >> >> > Could you please comment on this patch series. >> >> It's in the net-next-2.6 tree. >> >> If you need to make any more changes, they need to be relative >> to what went into my tree. > > I've pulled your net-next-2.6 tree again and I don't see them > in net-next-2.6 tree. Could you please check it again. Thanks! Strange, please resubmit your patches. Thanks. ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2010-02-26 20:48 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-02-17 14:55 [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 1/3] fs_enet: use dev_xxx instead of printk Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver Anatolij Gustschin 2010-02-17 14:55 ` [net-next-2.6 PATCH v2 3/3] fs_enet: add FEC TX buffer alignment workaround for MPC5121 Anatolij Gustschin 2010-02-17 15:13 ` Grant Likely 2010-02-17 15:17 ` Eric Dumazet 2010-02-17 21:31 ` Anatolij Gustschin 2010-02-17 22:08 ` [net-next-2.6 PATCH v3 " Anatolij Gustschin 2010-02-17 15:11 ` [net-next-2.6 PATCH v2 2/3] fs_enet: Add support for MPC512x to fs_enet driver Grant Likely 2010-02-22 11:37 ` [net-next-2.6 PATCH v2 0/3] Support for MPC512x FEC Anatolij Gustschin 2010-02-22 11:44 ` David Miller 2010-02-26 20:18 ` Anatolij Gustschin 2010-02-26 20:48 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).