aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/fs_enet/mac-fec.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/fs_enet/mac-fec.c')
-rw-r--r--drivers/net/fs_enet/mac-fec.c64
1 files changed, 39 insertions, 25 deletions
diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c
index ca7bcb8ab3a1..ec81f50d5919 100644
--- a/drivers/net/fs_enet/mac-fec.c
+++ b/drivers/net/fs_enet/mac-fec.c
@@ -19,7 +19,6 @@
19#include <linux/ptrace.h> 19#include <linux/ptrace.h>
20#include <linux/errno.h> 20#include <linux/errno.h>
21#include <linux/ioport.h> 21#include <linux/ioport.h>
22#include <linux/slab.h>
23#include <linux/interrupt.h> 22#include <linux/interrupt.h>
24#include <linux/init.h> 23#include <linux/init.h>
25#include <linux/delay.h> 24#include <linux/delay.h>
@@ -33,6 +32,7 @@
33#include <linux/fs.h> 32#include <linux/fs.h>
34#include <linux/platform_device.h> 33#include <linux/platform_device.h>
35#include <linux/of_device.h> 34#include <linux/of_device.h>
35#include <linux/gfp.h>
36 36
37#include <asm/irq.h> 37#include <asm/irq.h>
38#include <asm/uaccess.h> 38#include <asm/uaccess.h>
@@ -80,7 +80,7 @@
80 */ 80 */
81#define FEC_RESET_DELAY 50 81#define FEC_RESET_DELAY 50
82 82
83static int whack_reset(fec_t __iomem *fecp) 83static int whack_reset(struct fec __iomem *fecp)
84{ 84{
85 int i; 85 int i;
86 86
@@ -168,7 +168,7 @@ static void cleanup_data(struct net_device *dev)
168static void set_promiscuous_mode(struct net_device *dev) 168static void set_promiscuous_mode(struct net_device *dev)
169{ 169{
170 struct fs_enet_private *fep = netdev_priv(dev); 170 struct fs_enet_private *fep = netdev_priv(dev);
171 fec_t __iomem *fecp = fep->fec.fecp; 171 struct fec __iomem *fecp = fep->fec.fecp;
172 172
173 FS(fecp, r_cntrl, FEC_RCNTRL_PROM); 173 FS(fecp, r_cntrl, FEC_RCNTRL_PROM);
174} 174}
@@ -216,11 +216,11 @@ static void set_multicast_one(struct net_device *dev, const u8 *mac)
216static void set_multicast_finish(struct net_device *dev) 216static void set_multicast_finish(struct net_device *dev)
217{ 217{
218 struct fs_enet_private *fep = netdev_priv(dev); 218 struct fs_enet_private *fep = netdev_priv(dev);
219 fec_t __iomem *fecp = fep->fec.fecp; 219 struct fec __iomem *fecp = fep->fec.fecp;
220 220
221 /* if all multi or too many multicasts; just enable all */ 221 /* if all multi or too many multicasts; just enable all */
222 if ((dev->flags & IFF_ALLMULTI) != 0 || 222 if ((dev->flags & IFF_ALLMULTI) != 0 ||
223 dev->mc_count > FEC_MAX_MULTICAST_ADDRS) { 223 netdev_mc_count(dev) > FEC_MAX_MULTICAST_ADDRS) {
224 fep->fec.hthi = 0xffffffffU; 224 fep->fec.hthi = 0xffffffffU;
225 fep->fec.htlo = 0xffffffffU; 225 fep->fec.htlo = 0xffffffffU;
226 } 226 }
@@ -236,7 +236,7 @@ static void set_multicast_list(struct net_device *dev)
236 236
237 if ((dev->flags & IFF_PROMISC) == 0) { 237 if ((dev->flags & IFF_PROMISC) == 0) {
238 set_multicast_start(dev); 238 set_multicast_start(dev);
239 for (pmc = dev->mc_list; pmc != NULL; pmc = pmc->next) 239 netdev_for_each_mc_addr(pmc, dev)
240 set_multicast_one(dev, pmc->dmi_addr); 240 set_multicast_one(dev, pmc->dmi_addr);
241 set_multicast_finish(dev); 241 set_multicast_finish(dev);
242 } else 242 } else
@@ -246,7 +246,7 @@ static void set_multicast_list(struct net_device *dev)
246static void restart(struct net_device *dev) 246static void restart(struct net_device *dev)
247{ 247{
248 struct fs_enet_private *fep = netdev_priv(dev); 248 struct fs_enet_private *fep = netdev_priv(dev);
249 fec_t __iomem *fecp = fep->fec.fecp; 249 struct fec __iomem *fecp = fep->fec.fecp;
250 const struct fs_platform_info *fpi = fep->fpi; 250 const struct fs_platform_info *fpi = fep->fpi;
251 dma_addr_t rx_bd_base_phys, tx_bd_base_phys; 251 dma_addr_t rx_bd_base_phys, tx_bd_base_phys;
252 int r; 252 int r;
@@ -257,8 +257,7 @@ static void restart(struct net_device *dev)
257 257
258 r = whack_reset(fep->fec.fecp); 258 r = whack_reset(fep->fec.fecp);
259 if (r != 0) 259 if (r != 0)
260 printk(KERN_ERR DRV_MODULE_NAME 260 dev_err(fep->dev, "FEC Reset FAILED!\n");
261 ": %s FEC Reset FAILED!\n", dev->name);
262 /* 261 /*
263 * Set station address. 262 * Set station address.
264 */ 263 */
@@ -281,7 +280,11 @@ static void restart(struct net_device *dev)
281 * Set maximum receive buffer size. 280 * Set maximum receive buffer size.
282 */ 281 */
283 FW(fecp, r_buff_size, PKT_MAXBLR_SIZE); 282 FW(fecp, r_buff_size, PKT_MAXBLR_SIZE);
283#ifdef CONFIG_FS_ENET_MPC5121_FEC
284 FW(fecp, r_cntrl, PKT_MAXBUF_SIZE << 16);
285#else
284 FW(fecp, r_hash, PKT_MAXBUF_SIZE); 286 FW(fecp, r_hash, PKT_MAXBUF_SIZE);
287#endif
285 288
286 /* get physical address */ 289 /* get physical address */
287 rx_bd_base_phys = fep->ring_mem_addr; 290 rx_bd_base_phys = fep->ring_mem_addr;
@@ -298,7 +301,11 @@ static void restart(struct net_device *dev)
298 /* 301 /*
299 * Enable big endian and don't care about SDMA FC. 302 * Enable big endian and don't care about SDMA FC.
300 */ 303 */
304#ifdef CONFIG_FS_ENET_MPC5121_FEC
305 FS(fecp, dma_control, 0xC0000000);
306#else
301 FW(fecp, fun_code, 0x78000000); 307 FW(fecp, fun_code, 0x78000000);
308#endif
302 309
303 /* 310 /*
304 * Set MII speed. 311 * Set MII speed.
@@ -309,9 +316,17 @@ static void restart(struct net_device *dev)
309 * Clear any outstanding interrupt. 316 * Clear any outstanding interrupt.
310 */ 317 */
311 FW(fecp, ievent, 0xffc0); 318 FW(fecp, ievent, 0xffc0);
319#ifndef CONFIG_FS_ENET_MPC5121_FEC
312 FW(fecp, ivec, (virq_to_hw(fep->interrupt) / 2) << 29); 320 FW(fecp, ivec, (virq_to_hw(fep->interrupt) / 2) << 29);
313 321
314 FW(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */ 322 FW(fecp, r_cntrl, FEC_RCNTRL_MII_MODE); /* MII enable */
323#else
324 /*
325 * Only set MII mode - do not touch maximum frame length
326 * configured before.
327 */
328 FS(fecp, r_cntrl, FEC_RCNTRL_MII_MODE);
329#endif
315 /* 330 /*
316 * adjust to duplex mode 331 * adjust to duplex mode
317 */ 332 */
@@ -340,7 +355,7 @@ static void stop(struct net_device *dev)
340{ 355{
341 struct fs_enet_private *fep = netdev_priv(dev); 356 struct fs_enet_private *fep = netdev_priv(dev);
342 const struct fs_platform_info *fpi = fep->fpi; 357 const struct fs_platform_info *fpi = fep->fpi;
343 fec_t __iomem *fecp = fep->fec.fecp; 358 struct fec __iomem *fecp = fep->fec.fecp;
344 359
345 struct fec_info* feci= fep->phydev->bus->priv; 360 struct fec_info* feci= fep->phydev->bus->priv;
346 361
@@ -355,9 +370,7 @@ static void stop(struct net_device *dev)
355 udelay(1); 370 udelay(1);
356 371
357 if (i == FEC_RESET_DELAY) 372 if (i == FEC_RESET_DELAY)
358 printk(KERN_WARNING DRV_MODULE_NAME 373 dev_warn(fep->dev, "FEC timeout on graceful transmit stop\n");
359 ": %s FEC timeout on graceful transmit stop\n",
360 dev->name);
361 /* 374 /*
362 * Disable FEC. Let only MII interrupts. 375 * Disable FEC. Let only MII interrupts.
363 */ 376 */
@@ -378,7 +391,7 @@ static void stop(struct net_device *dev)
378static void napi_clear_rx_event(struct net_device *dev) 391static void napi_clear_rx_event(struct net_device *dev)
379{ 392{
380 struct fs_enet_private *fep = netdev_priv(dev); 393 struct fs_enet_private *fep = netdev_priv(dev);
381 fec_t __iomem *fecp = fep->fec.fecp; 394 struct fec __iomem *fecp = fep->fec.fecp;
382 395
383 FW(fecp, ievent, FEC_NAPI_RX_EVENT_MSK); 396 FW(fecp, ievent, FEC_NAPI_RX_EVENT_MSK);
384} 397}
@@ -386,7 +399,7 @@ static void napi_clear_rx_event(struct net_device *dev)
386static void napi_enable_rx(struct net_device *dev) 399static void napi_enable_rx(struct net_device *dev)
387{ 400{
388 struct fs_enet_private *fep = netdev_priv(dev); 401 struct fs_enet_private *fep = netdev_priv(dev);
389 fec_t __iomem *fecp = fep->fec.fecp; 402 struct fec __iomem *fecp = fep->fec.fecp;
390 403
391 FS(fecp, imask, FEC_NAPI_RX_EVENT_MSK); 404 FS(fecp, imask, FEC_NAPI_RX_EVENT_MSK);
392} 405}
@@ -394,7 +407,7 @@ static void napi_enable_rx(struct net_device *dev)
394static void napi_disable_rx(struct net_device *dev) 407static void napi_disable_rx(struct net_device *dev)
395{ 408{
396 struct fs_enet_private *fep = netdev_priv(dev); 409 struct fs_enet_private *fep = netdev_priv(dev);
397 fec_t __iomem *fecp = fep->fec.fecp; 410 struct fec __iomem *fecp = fep->fec.fecp;
398 411
399 FC(fecp, imask, FEC_NAPI_RX_EVENT_MSK); 412 FC(fecp, imask, FEC_NAPI_RX_EVENT_MSK);
400} 413}
@@ -402,7 +415,7 @@ static void napi_disable_rx(struct net_device *dev)
402static void rx_bd_done(struct net_device *dev) 415static void rx_bd_done(struct net_device *dev)
403{ 416{
404 struct fs_enet_private *fep = netdev_priv(dev); 417 struct fs_enet_private *fep = netdev_priv(dev);
405 fec_t __iomem *fecp = fep->fec.fecp; 418 struct fec __iomem *fecp = fep->fec.fecp;
406 419
407 FW(fecp, r_des_active, 0x01000000); 420 FW(fecp, r_des_active, 0x01000000);
408} 421}
@@ -410,7 +423,7 @@ static void rx_bd_done(struct net_device *dev)
410static void tx_kickstart(struct net_device *dev) 423static void tx_kickstart(struct net_device *dev)
411{ 424{
412 struct fs_enet_private *fep = netdev_priv(dev); 425 struct fs_enet_private *fep = netdev_priv(dev);
413 fec_t __iomem *fecp = fep->fec.fecp; 426 struct fec __iomem *fecp = fep->fec.fecp;
414 427
415 FW(fecp, x_des_active, 0x01000000); 428 FW(fecp, x_des_active, 0x01000000);
416} 429}
@@ -418,7 +431,7 @@ static void tx_kickstart(struct net_device *dev)
418static u32 get_int_events(struct net_device *dev) 431static u32 get_int_events(struct net_device *dev)
419{ 432{
420 struct fs_enet_private *fep = netdev_priv(dev); 433 struct fs_enet_private *fep = netdev_priv(dev);
421 fec_t __iomem *fecp = fep->fec.fecp; 434 struct fec __iomem *fecp = fep->fec.fecp;
422 435
423 return FR(fecp, ievent) & FR(fecp, imask); 436 return FR(fecp, ievent) & FR(fecp, imask);
424} 437}
@@ -426,32 +439,33 @@ static u32 get_int_events(struct net_device *dev)
426static void clear_int_events(struct net_device *dev, u32 int_events) 439static void clear_int_events(struct net_device *dev, u32 int_events)
427{ 440{
428 struct fs_enet_private *fep = netdev_priv(dev); 441 struct fs_enet_private *fep = netdev_priv(dev);
429 fec_t __iomem *fecp = fep->fec.fecp; 442 struct fec __iomem *fecp = fep->fec.fecp;
430 443
431 FW(fecp, ievent, int_events); 444 FW(fecp, ievent, int_events);
432} 445}
433 446
434static void ev_error(struct net_device *dev, u32 int_events) 447static void ev_error(struct net_device *dev, u32 int_events)
435{ 448{
436 printk(KERN_WARNING DRV_MODULE_NAME 449 struct fs_enet_private *fep = netdev_priv(dev);
437 ": %s FEC ERROR(s) 0x%x\n", dev->name, int_events); 450
451 dev_warn(fep->dev, "FEC ERROR(s) 0x%x\n", int_events);
438} 452}
439 453
440static int get_regs(struct net_device *dev, void *p, int *sizep) 454static int get_regs(struct net_device *dev, void *p, int *sizep)
441{ 455{
442 struct fs_enet_private *fep = netdev_priv(dev); 456 struct fs_enet_private *fep = netdev_priv(dev);
443 457
444 if (*sizep < sizeof(fec_t)) 458 if (*sizep < sizeof(struct fec))
445 return -EINVAL; 459 return -EINVAL;
446 460
447 memcpy_fromio(p, fep->fec.fecp, sizeof(fec_t)); 461 memcpy_fromio(p, fep->fec.fecp, sizeof(struct fec));
448 462
449 return 0; 463 return 0;
450} 464}
451 465
452static int get_regs_len(struct net_device *dev) 466static int get_regs_len(struct net_device *dev)
453{ 467{
454 return sizeof(fec_t); 468 return sizeof(struct fec);
455} 469}
456 470
457static void tx_restart(struct net_device *dev) 471static void tx_restart(struct net_device *dev)