diff options
Diffstat (limited to 'drivers/net/fs_enet/mac-fec.c')
-rw-r--r-- | drivers/net/fs_enet/mac-fec.c | 64 |
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 | ||
83 | static int whack_reset(fec_t __iomem *fecp) | 83 | static 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) | |||
168 | static void set_promiscuous_mode(struct net_device *dev) | 168 | static 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) | |||
216 | static void set_multicast_finish(struct net_device *dev) | 216 | static 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) | |||
246 | static void restart(struct net_device *dev) | 246 | static 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) | |||
378 | static void napi_clear_rx_event(struct net_device *dev) | 391 | static 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) | |||
386 | static void napi_enable_rx(struct net_device *dev) | 399 | static 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) | |||
394 | static void napi_disable_rx(struct net_device *dev) | 407 | static 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) | |||
402 | static void rx_bd_done(struct net_device *dev) | 415 | static 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) | |||
410 | static void tx_kickstart(struct net_device *dev) | 423 | static 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) | |||
418 | static u32 get_int_events(struct net_device *dev) | 431 | static 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) | |||
426 | static void clear_int_events(struct net_device *dev, u32 int_events) | 439 | static 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 | ||
434 | static void ev_error(struct net_device *dev, u32 int_events) | 447 | static 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 | ||
440 | static int get_regs(struct net_device *dev, void *p, int *sizep) | 454 | static 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 | ||
452 | static int get_regs_len(struct net_device *dev) | 466 | static int get_regs_len(struct net_device *dev) |
453 | { | 467 | { |
454 | return sizeof(fec_t); | 468 | return sizeof(struct fec); |
455 | } | 469 | } |
456 | 470 | ||
457 | static void tx_restart(struct net_device *dev) | 471 | static void tx_restart(struct net_device *dev) |