diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/tc35815.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/tc35815.c')
-rw-r--r-- | drivers/net/tc35815.c | 320 |
1 files changed, 25 insertions, 295 deletions
diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index d1298e5b72c5..49bd84c0d583 100644 --- a/drivers/net/tc35815.c +++ b/drivers/net/tc35815.c | |||
@@ -22,11 +22,7 @@ | |||
22 | * All Rights Reserved. | 22 | * All Rights Reserved. |
23 | */ | 23 | */ |
24 | 24 | ||
25 | #ifdef TC35815_NAPI | 25 | #define DRV_VERSION "1.39" |
26 | #define DRV_VERSION "1.38-NAPI" | ||
27 | #else | ||
28 | #define DRV_VERSION "1.38" | ||
29 | #endif | ||
30 | static const char *version = "tc35815.c:v" DRV_VERSION "\n"; | 26 | static const char *version = "tc35815.c:v" DRV_VERSION "\n"; |
31 | #define MODNAME "tc35815" | 27 | #define MODNAME "tc35815" |
32 | 28 | ||
@@ -54,13 +50,6 @@ static const char *version = "tc35815.c:v" DRV_VERSION "\n"; | |||
54 | #include <asm/io.h> | 50 | #include <asm/io.h> |
55 | #include <asm/byteorder.h> | 51 | #include <asm/byteorder.h> |
56 | 52 | ||
57 | /* First, a few definitions that the brave might change. */ | ||
58 | |||
59 | #define GATHER_TXINT /* On-Demand Tx Interrupt */ | ||
60 | #define WORKAROUND_LOSTCAR | ||
61 | #define WORKAROUND_100HALF_PROMISC | ||
62 | /* #define TC35815_USE_PACKEDBUFFER */ | ||
63 | |||
64 | enum tc35815_chiptype { | 53 | enum tc35815_chiptype { |
65 | TC35815CF = 0, | 54 | TC35815CF = 0, |
66 | TC35815_NWU, | 55 | TC35815_NWU, |
@@ -76,7 +65,7 @@ static const struct { | |||
76 | { "TOSHIBA TC35815/TX4939" }, | 65 | { "TOSHIBA TC35815/TX4939" }, |
77 | }; | 66 | }; |
78 | 67 | ||
79 | static const struct pci_device_id tc35815_pci_tbl[] = { | 68 | static DEFINE_PCI_DEVICE_TABLE(tc35815_pci_tbl) = { |
80 | {PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815CF), .driver_data = TC35815CF }, | 69 | {PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815CF), .driver_data = TC35815CF }, |
81 | {PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815_NWU), .driver_data = TC35815_NWU }, | 70 | {PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815_NWU), .driver_data = TC35815_NWU }, |
82 | {PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815_TX4939), .driver_data = TC35815_TX4939 }, | 71 | {PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA_2, PCI_DEVICE_ID_TOSHIBA_TC35815_TX4939), .driver_data = TC35815_TX4939 }, |
@@ -330,17 +319,10 @@ struct BDesc { | |||
330 | 319 | ||
331 | 320 | ||
332 | /* Some useful constants. */ | 321 | /* Some useful constants. */ |
333 | #undef NO_CHECK_CARRIER /* Does not check No-Carrier with TP */ | ||
334 | 322 | ||
335 | #ifdef NO_CHECK_CARRIER | 323 | #define TX_CTL_CMD (Tx_EnTxPar | Tx_EnLateColl | \ |
336 | #define TX_CTL_CMD (Tx_EnComp | Tx_EnTxPar | Tx_EnLateColl | \ | ||
337 | Tx_EnExColl | Tx_EnExDefer | Tx_EnUnder | \ | ||
338 | Tx_En) /* maybe 0x7b01 */ | ||
339 | #else | ||
340 | #define TX_CTL_CMD (Tx_EnComp | Tx_EnTxPar | Tx_EnLateColl | \ | ||
341 | Tx_EnExColl | Tx_EnLCarr | Tx_EnExDefer | Tx_EnUnder | \ | 324 | Tx_EnExColl | Tx_EnLCarr | Tx_EnExDefer | Tx_EnUnder | \ |
342 | Tx_En) /* maybe 0x7b01 */ | 325 | Tx_En) /* maybe 0x7b01 */ |
343 | #endif | ||
344 | /* Do not use Rx_StripCRC -- it causes trouble on BLEx/FDAEx condition */ | 326 | /* Do not use Rx_StripCRC -- it causes trouble on BLEx/FDAEx condition */ |
345 | #define RX_CTL_CMD (Rx_EnGood | Rx_EnRxPar | Rx_EnLongErr | Rx_EnOver \ | 327 | #define RX_CTL_CMD (Rx_EnGood | Rx_EnRxPar | Rx_EnLongErr | Rx_EnOver \ |
346 | | Rx_EnCRCErr | Rx_EnAlign | Rx_RxEn) /* maybe 0x6f01 */ | 328 | | Rx_EnCRCErr | Rx_EnAlign | Rx_RxEn) /* maybe 0x6f01 */ |
@@ -361,13 +343,6 @@ struct BDesc { | |||
361 | #define TX_THRESHOLD_KEEP_LIMIT 10 | 343 | #define TX_THRESHOLD_KEEP_LIMIT 10 |
362 | 344 | ||
363 | /* 16 + RX_BUF_NUM * 8 + RX_FD_NUM * 16 + TX_FD_NUM * 32 <= PAGE_SIZE*FD_PAGE_NUM */ | 345 | /* 16 + RX_BUF_NUM * 8 + RX_FD_NUM * 16 + TX_FD_NUM * 32 <= PAGE_SIZE*FD_PAGE_NUM */ |
364 | #ifdef TC35815_USE_PACKEDBUFFER | ||
365 | #define FD_PAGE_NUM 2 | ||
366 | #define RX_BUF_NUM 8 /* >= 2 */ | ||
367 | #define RX_FD_NUM 250 /* >= 32 */ | ||
368 | #define TX_FD_NUM 128 | ||
369 | #define RX_BUF_SIZE PAGE_SIZE | ||
370 | #else /* TC35815_USE_PACKEDBUFFER */ | ||
371 | #define FD_PAGE_NUM 4 | 346 | #define FD_PAGE_NUM 4 |
372 | #define RX_BUF_NUM 128 /* < 256 */ | 347 | #define RX_BUF_NUM 128 /* < 256 */ |
373 | #define RX_FD_NUM 256 /* >= 32 */ | 348 | #define RX_FD_NUM 256 /* >= 32 */ |
@@ -381,7 +356,6 @@ struct BDesc { | |||
381 | #define RX_BUF_SIZE \ | 356 | #define RX_BUF_SIZE \ |
382 | L1_CACHE_ALIGN(ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN + NET_IP_ALIGN) | 357 | L1_CACHE_ALIGN(ETH_FRAME_LEN + VLAN_HLEN + ETH_FCS_LEN + NET_IP_ALIGN) |
383 | #endif | 358 | #endif |
384 | #endif /* TC35815_USE_PACKEDBUFFER */ | ||
385 | #define RX_FD_RESERVE (2 / 2) /* max 2 BD per RxFD */ | 359 | #define RX_FD_RESERVE (2 / 2) /* max 2 BD per RxFD */ |
386 | #define NAPI_WEIGHT 16 | 360 | #define NAPI_WEIGHT 16 |
387 | 361 | ||
@@ -428,6 +402,7 @@ struct tc35815_local { | |||
428 | * by this lock as well. | 402 | * by this lock as well. |
429 | */ | 403 | */ |
430 | spinlock_t lock; | 404 | spinlock_t lock; |
405 | spinlock_t rx_lock; | ||
431 | 406 | ||
432 | struct mii_bus *mii_bus; | 407 | struct mii_bus *mii_bus; |
433 | struct phy_device *phy_dev; | 408 | struct phy_device *phy_dev; |
@@ -439,11 +414,7 @@ struct tc35815_local { | |||
439 | /* | 414 | /* |
440 | * Transmitting: Batch Mode. | 415 | * Transmitting: Batch Mode. |
441 | * 1 BD in 1 TxFD. | 416 | * 1 BD in 1 TxFD. |
442 | * Receiving: Packing Mode. (TC35815_USE_PACKEDBUFFER) | 417 | * Receiving: Non-Packing Mode. |
443 | * 1 circular FD for Free Buffer List. | ||
444 | * RX_BUF_NUM BD in Free Buffer FD. | ||
445 | * One Free Buffer BD has PAGE_SIZE data buffer. | ||
446 | * Or Non-Packing Mode. | ||
447 | * 1 circular FD for Free Buffer List. | 418 | * 1 circular FD for Free Buffer List. |
448 | * RX_BUF_NUM BD in Free Buffer FD. | 419 | * RX_BUF_NUM BD in Free Buffer FD. |
449 | * One Free Buffer BD has ETH_FRAME_LEN data buffer. | 420 | * One Free Buffer BD has ETH_FRAME_LEN data buffer. |
@@ -457,21 +428,11 @@ struct tc35815_local { | |||
457 | struct RxFD *rfd_limit; | 428 | struct RxFD *rfd_limit; |
458 | struct RxFD *rfd_cur; | 429 | struct RxFD *rfd_cur; |
459 | struct FrFD *fbl_ptr; | 430 | struct FrFD *fbl_ptr; |
460 | #ifdef TC35815_USE_PACKEDBUFFER | ||
461 | unsigned char fbl_curid; | ||
462 | void *data_buf[RX_BUF_NUM]; /* packing */ | ||
463 | dma_addr_t data_buf_dma[RX_BUF_NUM]; | ||
464 | struct { | ||
465 | struct sk_buff *skb; | ||
466 | dma_addr_t skb_dma; | ||
467 | } tx_skbs[TX_FD_NUM]; | ||
468 | #else | ||
469 | unsigned int fbl_count; | 431 | unsigned int fbl_count; |
470 | struct { | 432 | struct { |
471 | struct sk_buff *skb; | 433 | struct sk_buff *skb; |
472 | dma_addr_t skb_dma; | 434 | dma_addr_t skb_dma; |
473 | } tx_skbs[TX_FD_NUM], rx_skbs[RX_BUF_NUM]; | 435 | } tx_skbs[TX_FD_NUM], rx_skbs[RX_BUF_NUM]; |
474 | #endif | ||
475 | u32 msg_enable; | 436 | u32 msg_enable; |
476 | enum tc35815_chiptype chiptype; | 437 | enum tc35815_chiptype chiptype; |
477 | }; | 438 | }; |
@@ -486,51 +447,6 @@ static inline void *fd_bus_to_virt(struct tc35815_local *lp, dma_addr_t bus) | |||
486 | return (void *)((u8 *)lp->fd_buf + (bus - lp->fd_buf_dma)); | 447 | return (void *)((u8 *)lp->fd_buf + (bus - lp->fd_buf_dma)); |
487 | } | 448 | } |
488 | #endif | 449 | #endif |
489 | #ifdef TC35815_USE_PACKEDBUFFER | ||
490 | static inline void *rxbuf_bus_to_virt(struct tc35815_local *lp, dma_addr_t bus) | ||
491 | { | ||
492 | int i; | ||
493 | for (i = 0; i < RX_BUF_NUM; i++) { | ||
494 | if (bus >= lp->data_buf_dma[i] && | ||
495 | bus < lp->data_buf_dma[i] + PAGE_SIZE) | ||
496 | return (void *)((u8 *)lp->data_buf[i] + | ||
497 | (bus - lp->data_buf_dma[i])); | ||
498 | } | ||
499 | return NULL; | ||
500 | } | ||
501 | |||
502 | #define TC35815_DMA_SYNC_ONDEMAND | ||
503 | static void *alloc_rxbuf_page(struct pci_dev *hwdev, dma_addr_t *dma_handle) | ||
504 | { | ||
505 | #ifdef TC35815_DMA_SYNC_ONDEMAND | ||
506 | void *buf; | ||
507 | /* pci_map + pci_dma_sync will be more effective than | ||
508 | * pci_alloc_consistent on some archs. */ | ||
509 | buf = (void *)__get_free_page(GFP_ATOMIC); | ||
510 | if (!buf) | ||
511 | return NULL; | ||
512 | *dma_handle = pci_map_single(hwdev, buf, PAGE_SIZE, | ||
513 | PCI_DMA_FROMDEVICE); | ||
514 | if (pci_dma_mapping_error(hwdev, *dma_handle)) { | ||
515 | free_page((unsigned long)buf); | ||
516 | return NULL; | ||
517 | } | ||
518 | return buf; | ||
519 | #else | ||
520 | return pci_alloc_consistent(hwdev, PAGE_SIZE, dma_handle); | ||
521 | #endif | ||
522 | } | ||
523 | |||
524 | static void free_rxbuf_page(struct pci_dev *hwdev, void *buf, dma_addr_t dma_handle) | ||
525 | { | ||
526 | #ifdef TC35815_DMA_SYNC_ONDEMAND | ||
527 | pci_unmap_single(hwdev, dma_handle, PAGE_SIZE, PCI_DMA_FROMDEVICE); | ||
528 | free_page((unsigned long)buf); | ||
529 | #else | ||
530 | pci_free_consistent(hwdev, PAGE_SIZE, buf, dma_handle); | ||
531 | #endif | ||
532 | } | ||
533 | #else /* TC35815_USE_PACKEDBUFFER */ | ||
534 | static struct sk_buff *alloc_rxbuf_skb(struct net_device *dev, | 450 | static struct sk_buff *alloc_rxbuf_skb(struct net_device *dev, |
535 | struct pci_dev *hwdev, | 451 | struct pci_dev *hwdev, |
536 | dma_addr_t *dma_handle) | 452 | dma_addr_t *dma_handle) |
@@ -555,19 +471,14 @@ static void free_rxbuf_skb(struct pci_dev *hwdev, struct sk_buff *skb, dma_addr_ | |||
555 | PCI_DMA_FROMDEVICE); | 471 | PCI_DMA_FROMDEVICE); |
556 | dev_kfree_skb_any(skb); | 472 | dev_kfree_skb_any(skb); |
557 | } | 473 | } |
558 | #endif /* TC35815_USE_PACKEDBUFFER */ | ||
559 | 474 | ||
560 | /* Index to functions, as function prototypes. */ | 475 | /* Index to functions, as function prototypes. */ |
561 | 476 | ||
562 | static int tc35815_open(struct net_device *dev); | 477 | static int tc35815_open(struct net_device *dev); |
563 | static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev); | 478 | static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev); |
564 | static irqreturn_t tc35815_interrupt(int irq, void *dev_id); | 479 | static irqreturn_t tc35815_interrupt(int irq, void *dev_id); |
565 | #ifdef TC35815_NAPI | ||
566 | static int tc35815_rx(struct net_device *dev, int limit); | 480 | static int tc35815_rx(struct net_device *dev, int limit); |
567 | static int tc35815_poll(struct napi_struct *napi, int budget); | 481 | static int tc35815_poll(struct napi_struct *napi, int budget); |
568 | #else | ||
569 | static void tc35815_rx(struct net_device *dev); | ||
570 | #endif | ||
571 | static void tc35815_txdone(struct net_device *dev); | 482 | static void tc35815_txdone(struct net_device *dev); |
572 | static int tc35815_close(struct net_device *dev); | 483 | static int tc35815_close(struct net_device *dev); |
573 | static struct net_device_stats *tc35815_get_stats(struct net_device *dev); | 484 | static struct net_device_stats *tc35815_get_stats(struct net_device *dev); |
@@ -654,8 +565,6 @@ static void tc_handle_link_change(struct net_device *dev) | |||
654 | * TX4939 PCFG.SPEEDn bit will be changed on | 565 | * TX4939 PCFG.SPEEDn bit will be changed on |
655 | * NETDEV_CHANGE event. | 566 | * NETDEV_CHANGE event. |
656 | */ | 567 | */ |
657 | |||
658 | #if !defined(NO_CHECK_CARRIER) && defined(WORKAROUND_LOSTCAR) | ||
659 | /* | 568 | /* |
660 | * WORKAROUND: enable LostCrS only if half duplex | 569 | * WORKAROUND: enable LostCrS only if half duplex |
661 | * operation. | 570 | * operation. |
@@ -665,7 +574,6 @@ static void tc_handle_link_change(struct net_device *dev) | |||
665 | lp->chiptype != TC35815_TX4939) | 574 | lp->chiptype != TC35815_TX4939) |
666 | tc_writel(tc_readl(&tr->Tx_Ctl) | Tx_EnLCarr, | 575 | tc_writel(tc_readl(&tr->Tx_Ctl) | Tx_EnLCarr, |
667 | &tr->Tx_Ctl); | 576 | &tr->Tx_Ctl); |
668 | #endif | ||
669 | 577 | ||
670 | lp->speed = phydev->speed; | 578 | lp->speed = phydev->speed; |
671 | lp->duplex = phydev->duplex; | 579 | lp->duplex = phydev->duplex; |
@@ -674,11 +582,9 @@ static void tc_handle_link_change(struct net_device *dev) | |||
674 | 582 | ||
675 | if (phydev->link != lp->link) { | 583 | if (phydev->link != lp->link) { |
676 | if (phydev->link) { | 584 | if (phydev->link) { |
677 | #ifdef WORKAROUND_100HALF_PROMISC | ||
678 | /* delayed promiscuous enabling */ | 585 | /* delayed promiscuous enabling */ |
679 | if (dev->flags & IFF_PROMISC) | 586 | if (dev->flags & IFF_PROMISC) |
680 | tc35815_set_multicast_list(dev); | 587 | tc35815_set_multicast_list(dev); |
681 | #endif | ||
682 | } else { | 588 | } else { |
683 | lp->speed = 0; | 589 | lp->speed = 0; |
684 | lp->duplex = -1; | 590 | lp->duplex = -1; |
@@ -923,15 +829,14 @@ static int __devinit tc35815_init_one(struct pci_dev *pdev, | |||
923 | dev->netdev_ops = &tc35815_netdev_ops; | 829 | dev->netdev_ops = &tc35815_netdev_ops; |
924 | dev->ethtool_ops = &tc35815_ethtool_ops; | 830 | dev->ethtool_ops = &tc35815_ethtool_ops; |
925 | dev->watchdog_timeo = TC35815_TX_TIMEOUT; | 831 | dev->watchdog_timeo = TC35815_TX_TIMEOUT; |
926 | #ifdef TC35815_NAPI | ||
927 | netif_napi_add(dev, &lp->napi, tc35815_poll, NAPI_WEIGHT); | 832 | netif_napi_add(dev, &lp->napi, tc35815_poll, NAPI_WEIGHT); |
928 | #endif | ||
929 | 833 | ||
930 | dev->irq = pdev->irq; | 834 | dev->irq = pdev->irq; |
931 | dev->base_addr = (unsigned long)ioaddr; | 835 | dev->base_addr = (unsigned long)ioaddr; |
932 | 836 | ||
933 | INIT_WORK(&lp->restart_work, tc35815_restart_work); | 837 | INIT_WORK(&lp->restart_work, tc35815_restart_work); |
934 | spin_lock_init(&lp->lock); | 838 | spin_lock_init(&lp->lock); |
839 | spin_lock_init(&lp->rx_lock); | ||
935 | lp->pci_dev = pdev; | 840 | lp->pci_dev = pdev; |
936 | lp->chiptype = ent->driver_data; | 841 | lp->chiptype = ent->driver_data; |
937 | 842 | ||
@@ -1007,25 +912,6 @@ tc35815_init_queues(struct net_device *dev) | |||
1007 | if (!lp->fd_buf) | 912 | if (!lp->fd_buf) |
1008 | return -ENOMEM; | 913 | return -ENOMEM; |
1009 | for (i = 0; i < RX_BUF_NUM; i++) { | 914 | for (i = 0; i < RX_BUF_NUM; i++) { |
1010 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1011 | lp->data_buf[i] = | ||
1012 | alloc_rxbuf_page(lp->pci_dev, | ||
1013 | &lp->data_buf_dma[i]); | ||
1014 | if (!lp->data_buf[i]) { | ||
1015 | while (--i >= 0) { | ||
1016 | free_rxbuf_page(lp->pci_dev, | ||
1017 | lp->data_buf[i], | ||
1018 | lp->data_buf_dma[i]); | ||
1019 | lp->data_buf[i] = NULL; | ||
1020 | } | ||
1021 | pci_free_consistent(lp->pci_dev, | ||
1022 | PAGE_SIZE * FD_PAGE_NUM, | ||
1023 | lp->fd_buf, | ||
1024 | lp->fd_buf_dma); | ||
1025 | lp->fd_buf = NULL; | ||
1026 | return -ENOMEM; | ||
1027 | } | ||
1028 | #else | ||
1029 | lp->rx_skbs[i].skb = | 915 | lp->rx_skbs[i].skb = |
1030 | alloc_rxbuf_skb(dev, lp->pci_dev, | 916 | alloc_rxbuf_skb(dev, lp->pci_dev, |
1031 | &lp->rx_skbs[i].skb_dma); | 917 | &lp->rx_skbs[i].skb_dma); |
@@ -1043,15 +929,9 @@ tc35815_init_queues(struct net_device *dev) | |||
1043 | lp->fd_buf = NULL; | 929 | lp->fd_buf = NULL; |
1044 | return -ENOMEM; | 930 | return -ENOMEM; |
1045 | } | 931 | } |
1046 | #endif | ||
1047 | } | 932 | } |
1048 | printk(KERN_DEBUG "%s: FD buf %p DataBuf", | 933 | printk(KERN_DEBUG "%s: FD buf %p DataBuf", |
1049 | dev->name, lp->fd_buf); | 934 | dev->name, lp->fd_buf); |
1050 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1051 | printk(" DataBuf"); | ||
1052 | for (i = 0; i < RX_BUF_NUM; i++) | ||
1053 | printk(" %p", lp->data_buf[i]); | ||
1054 | #endif | ||
1055 | printk("\n"); | 935 | printk("\n"); |
1056 | } else { | 936 | } else { |
1057 | for (i = 0; i < FD_PAGE_NUM; i++) | 937 | for (i = 0; i < FD_PAGE_NUM; i++) |
@@ -1084,7 +964,6 @@ tc35815_init_queues(struct net_device *dev) | |||
1084 | lp->fbl_ptr = (struct FrFD *)fd_addr; | 964 | lp->fbl_ptr = (struct FrFD *)fd_addr; |
1085 | lp->fbl_ptr->fd.FDNext = cpu_to_le32(fd_virt_to_bus(lp, lp->fbl_ptr)); | 965 | lp->fbl_ptr->fd.FDNext = cpu_to_le32(fd_virt_to_bus(lp, lp->fbl_ptr)); |
1086 | lp->fbl_ptr->fd.FDCtl = cpu_to_le32(RX_BUF_NUM | FD_CownsFD); | 966 | lp->fbl_ptr->fd.FDCtl = cpu_to_le32(RX_BUF_NUM | FD_CownsFD); |
1087 | #ifndef TC35815_USE_PACKEDBUFFER | ||
1088 | /* | 967 | /* |
1089 | * move all allocated skbs to head of rx_skbs[] array. | 968 | * move all allocated skbs to head of rx_skbs[] array. |
1090 | * fbl_count mighe not be RX_BUF_NUM if alloc_rxbuf_skb() in | 969 | * fbl_count mighe not be RX_BUF_NUM if alloc_rxbuf_skb() in |
@@ -1102,11 +981,7 @@ tc35815_init_queues(struct net_device *dev) | |||
1102 | lp->fbl_count++; | 981 | lp->fbl_count++; |
1103 | } | 982 | } |
1104 | } | 983 | } |
1105 | #endif | ||
1106 | for (i = 0; i < RX_BUF_NUM; i++) { | 984 | for (i = 0; i < RX_BUF_NUM; i++) { |
1107 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1108 | lp->fbl_ptr->bd[i].BuffData = cpu_to_le32(lp->data_buf_dma[i]); | ||
1109 | #else | ||
1110 | if (i >= lp->fbl_count) { | 985 | if (i >= lp->fbl_count) { |
1111 | lp->fbl_ptr->bd[i].BuffData = 0; | 986 | lp->fbl_ptr->bd[i].BuffData = 0; |
1112 | lp->fbl_ptr->bd[i].BDCtl = 0; | 987 | lp->fbl_ptr->bd[i].BDCtl = 0; |
@@ -1114,15 +989,11 @@ tc35815_init_queues(struct net_device *dev) | |||
1114 | } | 989 | } |
1115 | lp->fbl_ptr->bd[i].BuffData = | 990 | lp->fbl_ptr->bd[i].BuffData = |
1116 | cpu_to_le32(lp->rx_skbs[i].skb_dma); | 991 | cpu_to_le32(lp->rx_skbs[i].skb_dma); |
1117 | #endif | ||
1118 | /* BDID is index of FrFD.bd[] */ | 992 | /* BDID is index of FrFD.bd[] */ |
1119 | lp->fbl_ptr->bd[i].BDCtl = | 993 | lp->fbl_ptr->bd[i].BDCtl = |
1120 | cpu_to_le32(BD_CownsBD | (i << BD_RxBDID_SHIFT) | | 994 | cpu_to_le32(BD_CownsBD | (i << BD_RxBDID_SHIFT) | |
1121 | RX_BUF_SIZE); | 995 | RX_BUF_SIZE); |
1122 | } | 996 | } |
1123 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1124 | lp->fbl_curid = 0; | ||
1125 | #endif | ||
1126 | 997 | ||
1127 | printk(KERN_DEBUG "%s: TxFD %p RxFD %p FrFD %p\n", | 998 | printk(KERN_DEBUG "%s: TxFD %p RxFD %p FrFD %p\n", |
1128 | dev->name, lp->tfd_base, lp->rfd_base, lp->fbl_ptr); | 999 | dev->name, lp->tfd_base, lp->rfd_base, lp->fbl_ptr); |
@@ -1196,19 +1067,11 @@ tc35815_free_queues(struct net_device *dev) | |||
1196 | lp->fbl_ptr = NULL; | 1067 | lp->fbl_ptr = NULL; |
1197 | 1068 | ||
1198 | for (i = 0; i < RX_BUF_NUM; i++) { | 1069 | for (i = 0; i < RX_BUF_NUM; i++) { |
1199 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1200 | if (lp->data_buf[i]) { | ||
1201 | free_rxbuf_page(lp->pci_dev, | ||
1202 | lp->data_buf[i], lp->data_buf_dma[i]); | ||
1203 | lp->data_buf[i] = NULL; | ||
1204 | } | ||
1205 | #else | ||
1206 | if (lp->rx_skbs[i].skb) { | 1070 | if (lp->rx_skbs[i].skb) { |
1207 | free_rxbuf_skb(lp->pci_dev, lp->rx_skbs[i].skb, | 1071 | free_rxbuf_skb(lp->pci_dev, lp->rx_skbs[i].skb, |
1208 | lp->rx_skbs[i].skb_dma); | 1072 | lp->rx_skbs[i].skb_dma); |
1209 | lp->rx_skbs[i].skb = NULL; | 1073 | lp->rx_skbs[i].skb = NULL; |
1210 | } | 1074 | } |
1211 | #endif | ||
1212 | } | 1075 | } |
1213 | if (lp->fd_buf) { | 1076 | if (lp->fd_buf) { |
1214 | pci_free_consistent(lp->pci_dev, PAGE_SIZE * FD_PAGE_NUM, | 1077 | pci_free_consistent(lp->pci_dev, PAGE_SIZE * FD_PAGE_NUM, |
@@ -1254,7 +1117,7 @@ dump_rxfd(struct RxFD *fd) | |||
1254 | return bd_count; | 1117 | return bd_count; |
1255 | } | 1118 | } |
1256 | 1119 | ||
1257 | #if defined(DEBUG) || defined(TC35815_USE_PACKEDBUFFER) | 1120 | #ifdef DEBUG |
1258 | static void | 1121 | static void |
1259 | dump_frfd(struct FrFD *fd) | 1122 | dump_frfd(struct FrFD *fd) |
1260 | { | 1123 | { |
@@ -1271,9 +1134,7 @@ dump_frfd(struct FrFD *fd) | |||
1271 | le32_to_cpu(fd->bd[i].BDCtl)); | 1134 | le32_to_cpu(fd->bd[i].BDCtl)); |
1272 | printk("\n"); | 1135 | printk("\n"); |
1273 | } | 1136 | } |
1274 | #endif | ||
1275 | 1137 | ||
1276 | #ifdef DEBUG | ||
1277 | static void | 1138 | static void |
1278 | panic_queues(struct net_device *dev) | 1139 | panic_queues(struct net_device *dev) |
1279 | { | 1140 | { |
@@ -1327,6 +1188,7 @@ static void tc35815_restart(struct net_device *dev) | |||
1327 | printk(KERN_ERR "%s: BMCR reset failed.\n", dev->name); | 1188 | printk(KERN_ERR "%s: BMCR reset failed.\n", dev->name); |
1328 | } | 1189 | } |
1329 | 1190 | ||
1191 | spin_lock_bh(&lp->rx_lock); | ||
1330 | spin_lock_irq(&lp->lock); | 1192 | spin_lock_irq(&lp->lock); |
1331 | tc35815_chip_reset(dev); | 1193 | tc35815_chip_reset(dev); |
1332 | tc35815_clear_queues(dev); | 1194 | tc35815_clear_queues(dev); |
@@ -1334,6 +1196,7 @@ static void tc35815_restart(struct net_device *dev) | |||
1334 | /* Reconfigure CAM again since tc35815_chip_init() initialize it. */ | 1196 | /* Reconfigure CAM again since tc35815_chip_init() initialize it. */ |
1335 | tc35815_set_multicast_list(dev); | 1197 | tc35815_set_multicast_list(dev); |
1336 | spin_unlock_irq(&lp->lock); | 1198 | spin_unlock_irq(&lp->lock); |
1199 | spin_unlock_bh(&lp->rx_lock); | ||
1337 | 1200 | ||
1338 | netif_wake_queue(dev); | 1201 | netif_wake_queue(dev); |
1339 | } | 1202 | } |
@@ -1352,11 +1215,14 @@ static void tc35815_schedule_restart(struct net_device *dev) | |||
1352 | struct tc35815_local *lp = netdev_priv(dev); | 1215 | struct tc35815_local *lp = netdev_priv(dev); |
1353 | struct tc35815_regs __iomem *tr = | 1216 | struct tc35815_regs __iomem *tr = |
1354 | (struct tc35815_regs __iomem *)dev->base_addr; | 1217 | (struct tc35815_regs __iomem *)dev->base_addr; |
1218 | unsigned long flags; | ||
1355 | 1219 | ||
1356 | /* disable interrupts */ | 1220 | /* disable interrupts */ |
1221 | spin_lock_irqsave(&lp->lock, flags); | ||
1357 | tc_writel(0, &tr->Int_En); | 1222 | tc_writel(0, &tr->Int_En); |
1358 | tc_writel(tc_readl(&tr->DMA_Ctl) | DMA_IntMask, &tr->DMA_Ctl); | 1223 | tc_writel(tc_readl(&tr->DMA_Ctl) | DMA_IntMask, &tr->DMA_Ctl); |
1359 | schedule_work(&lp->restart_work); | 1224 | schedule_work(&lp->restart_work); |
1225 | spin_unlock_irqrestore(&lp->lock, flags); | ||
1360 | } | 1226 | } |
1361 | 1227 | ||
1362 | static void tc35815_tx_timeout(struct net_device *dev) | 1228 | static void tc35815_tx_timeout(struct net_device *dev) |
@@ -1389,7 +1255,7 @@ tc35815_open(struct net_device *dev) | |||
1389 | * This is used if the interrupt line can turned off (shared). | 1255 | * This is used if the interrupt line can turned off (shared). |
1390 | * See 3c503.c for an example of selecting the IRQ at config-time. | 1256 | * See 3c503.c for an example of selecting the IRQ at config-time. |
1391 | */ | 1257 | */ |
1392 | if (request_irq(dev->irq, &tc35815_interrupt, IRQF_SHARED, | 1258 | if (request_irq(dev->irq, tc35815_interrupt, IRQF_SHARED, |
1393 | dev->name, dev)) | 1259 | dev->name, dev)) |
1394 | return -EAGAIN; | 1260 | return -EAGAIN; |
1395 | 1261 | ||
@@ -1400,9 +1266,7 @@ tc35815_open(struct net_device *dev) | |||
1400 | return -EAGAIN; | 1266 | return -EAGAIN; |
1401 | } | 1267 | } |
1402 | 1268 | ||
1403 | #ifdef TC35815_NAPI | ||
1404 | napi_enable(&lp->napi); | 1269 | napi_enable(&lp->napi); |
1405 | #endif | ||
1406 | 1270 | ||
1407 | /* Reset the hardware here. Don't forget to set the station address. */ | 1271 | /* Reset the hardware here. Don't forget to set the station address. */ |
1408 | spin_lock_irq(&lp->lock); | 1272 | spin_lock_irq(&lp->lock); |
@@ -1478,9 +1342,7 @@ static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev) | |||
1478 | (struct tc35815_regs __iomem *)dev->base_addr; | 1342 | (struct tc35815_regs __iomem *)dev->base_addr; |
1479 | /* Start DMA Transmitter. */ | 1343 | /* Start DMA Transmitter. */ |
1480 | txfd->fd.FDNext |= cpu_to_le32(FD_Next_EOL); | 1344 | txfd->fd.FDNext |= cpu_to_le32(FD_Next_EOL); |
1481 | #ifdef GATHER_TXINT | ||
1482 | txfd->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); | 1345 | txfd->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); |
1483 | #endif | ||
1484 | if (netif_msg_tx_queued(lp)) { | 1346 | if (netif_msg_tx_queued(lp)) { |
1485 | printk("%s: starting TxFD.\n", dev->name); | 1347 | printk("%s: starting TxFD.\n", dev->name); |
1486 | dump_txfd(txfd); | 1348 | dump_txfd(txfd); |
@@ -1536,11 +1398,7 @@ static void tc35815_fatal_error_interrupt(struct net_device *dev, u32 status) | |||
1536 | tc35815_schedule_restart(dev); | 1398 | tc35815_schedule_restart(dev); |
1537 | } | 1399 | } |
1538 | 1400 | ||
1539 | #ifdef TC35815_NAPI | ||
1540 | static int tc35815_do_interrupt(struct net_device *dev, u32 status, int limit) | 1401 | static int tc35815_do_interrupt(struct net_device *dev, u32 status, int limit) |
1541 | #else | ||
1542 | static int tc35815_do_interrupt(struct net_device *dev, u32 status) | ||
1543 | #endif | ||
1544 | { | 1402 | { |
1545 | struct tc35815_local *lp = netdev_priv(dev); | 1403 | struct tc35815_local *lp = netdev_priv(dev); |
1546 | int ret = -1; | 1404 | int ret = -1; |
@@ -1579,20 +1437,17 @@ static int tc35815_do_interrupt(struct net_device *dev, u32 status) | |||
1579 | /* normal notification */ | 1437 | /* normal notification */ |
1580 | if (status & Int_IntMacRx) { | 1438 | if (status & Int_IntMacRx) { |
1581 | /* Got a packet(s). */ | 1439 | /* Got a packet(s). */ |
1582 | #ifdef TC35815_NAPI | ||
1583 | ret = tc35815_rx(dev, limit); | 1440 | ret = tc35815_rx(dev, limit); |
1584 | #else | ||
1585 | tc35815_rx(dev); | ||
1586 | ret = 0; | ||
1587 | #endif | ||
1588 | lp->lstats.rx_ints++; | 1441 | lp->lstats.rx_ints++; |
1589 | } | 1442 | } |
1590 | if (status & Int_IntMacTx) { | 1443 | if (status & Int_IntMacTx) { |
1591 | /* Transmit complete. */ | 1444 | /* Transmit complete. */ |
1592 | lp->lstats.tx_ints++; | 1445 | lp->lstats.tx_ints++; |
1446 | spin_lock_irq(&lp->lock); | ||
1593 | tc35815_txdone(dev); | 1447 | tc35815_txdone(dev); |
1594 | netif_wake_queue(dev); | 1448 | spin_unlock_irq(&lp->lock); |
1595 | ret = 0; | 1449 | if (ret < 0) |
1450 | ret = 0; | ||
1596 | } | 1451 | } |
1597 | return ret; | 1452 | return ret; |
1598 | } | 1453 | } |
@@ -1607,7 +1462,6 @@ static irqreturn_t tc35815_interrupt(int irq, void *dev_id) | |||
1607 | struct tc35815_local *lp = netdev_priv(dev); | 1462 | struct tc35815_local *lp = netdev_priv(dev); |
1608 | struct tc35815_regs __iomem *tr = | 1463 | struct tc35815_regs __iomem *tr = |
1609 | (struct tc35815_regs __iomem *)dev->base_addr; | 1464 | (struct tc35815_regs __iomem *)dev->base_addr; |
1610 | #ifdef TC35815_NAPI | ||
1611 | u32 dmactl = tc_readl(&tr->DMA_Ctl); | 1465 | u32 dmactl = tc_readl(&tr->DMA_Ctl); |
1612 | 1466 | ||
1613 | if (!(dmactl & DMA_IntMask)) { | 1467 | if (!(dmactl & DMA_IntMask)) { |
@@ -1624,22 +1478,6 @@ static irqreturn_t tc35815_interrupt(int irq, void *dev_id) | |||
1624 | return IRQ_HANDLED; | 1478 | return IRQ_HANDLED; |
1625 | } | 1479 | } |
1626 | return IRQ_NONE; | 1480 | return IRQ_NONE; |
1627 | #else | ||
1628 | int handled; | ||
1629 | u32 status; | ||
1630 | |||
1631 | spin_lock(&lp->lock); | ||
1632 | status = tc_readl(&tr->Int_Src); | ||
1633 | /* BLEx, FDAEx will be cleared later */ | ||
1634 | tc_writel(status & ~(Int_BLEx | Int_FDAEx), | ||
1635 | &tr->Int_Src); /* write to clear */ | ||
1636 | handled = tc35815_do_interrupt(dev, status); | ||
1637 | if (status & (Int_BLEx | Int_FDAEx)) | ||
1638 | tc_writel(status & (Int_BLEx | Int_FDAEx), &tr->Int_Src); | ||
1639 | (void)tc_readl(&tr->Int_Src); /* flush */ | ||
1640 | spin_unlock(&lp->lock); | ||
1641 | return IRQ_RETVAL(handled >= 0); | ||
1642 | #endif /* TC35815_NAPI */ | ||
1643 | } | 1481 | } |
1644 | 1482 | ||
1645 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1483 | #ifdef CONFIG_NET_POLL_CONTROLLER |
@@ -1652,20 +1490,13 @@ static void tc35815_poll_controller(struct net_device *dev) | |||
1652 | #endif | 1490 | #endif |
1653 | 1491 | ||
1654 | /* We have a good packet(s), get it/them out of the buffers. */ | 1492 | /* We have a good packet(s), get it/them out of the buffers. */ |
1655 | #ifdef TC35815_NAPI | ||
1656 | static int | 1493 | static int |
1657 | tc35815_rx(struct net_device *dev, int limit) | 1494 | tc35815_rx(struct net_device *dev, int limit) |
1658 | #else | ||
1659 | static void | ||
1660 | tc35815_rx(struct net_device *dev) | ||
1661 | #endif | ||
1662 | { | 1495 | { |
1663 | struct tc35815_local *lp = netdev_priv(dev); | 1496 | struct tc35815_local *lp = netdev_priv(dev); |
1664 | unsigned int fdctl; | 1497 | unsigned int fdctl; |
1665 | int i; | 1498 | int i; |
1666 | #ifdef TC35815_NAPI | ||
1667 | int received = 0; | 1499 | int received = 0; |
1668 | #endif | ||
1669 | 1500 | ||
1670 | while (!((fdctl = le32_to_cpu(lp->rfd_cur->fd.FDCtl)) & FD_CownsFD)) { | 1501 | while (!((fdctl = le32_to_cpu(lp->rfd_cur->fd.FDCtl)) & FD_CownsFD)) { |
1671 | int status = le32_to_cpu(lp->rfd_cur->fd.FDStat); | 1502 | int status = le32_to_cpu(lp->rfd_cur->fd.FDStat); |
@@ -1684,52 +1515,9 @@ tc35815_rx(struct net_device *dev) | |||
1684 | struct sk_buff *skb; | 1515 | struct sk_buff *skb; |
1685 | unsigned char *data; | 1516 | unsigned char *data; |
1686 | int cur_bd; | 1517 | int cur_bd; |
1687 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1688 | int offset; | ||
1689 | #endif | ||
1690 | 1518 | ||
1691 | #ifdef TC35815_NAPI | ||
1692 | if (--limit < 0) | 1519 | if (--limit < 0) |
1693 | break; | 1520 | break; |
1694 | #endif | ||
1695 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1696 | BUG_ON(bd_count > 2); | ||
1697 | skb = dev_alloc_skb(pkt_len + NET_IP_ALIGN); | ||
1698 | if (skb == NULL) { | ||
1699 | printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", | ||
1700 | dev->name); | ||
1701 | dev->stats.rx_dropped++; | ||
1702 | break; | ||
1703 | } | ||
1704 | skb_reserve(skb, NET_IP_ALIGN); | ||
1705 | |||
1706 | data = skb_put(skb, pkt_len); | ||
1707 | |||
1708 | /* copy from receive buffer */ | ||
1709 | cur_bd = 0; | ||
1710 | offset = 0; | ||
1711 | while (offset < pkt_len && cur_bd < bd_count) { | ||
1712 | int len = le32_to_cpu(lp->rfd_cur->bd[cur_bd].BDCtl) & | ||
1713 | BD_BuffLength_MASK; | ||
1714 | dma_addr_t dma = le32_to_cpu(lp->rfd_cur->bd[cur_bd].BuffData); | ||
1715 | void *rxbuf = rxbuf_bus_to_virt(lp, dma); | ||
1716 | if (offset + len > pkt_len) | ||
1717 | len = pkt_len - offset; | ||
1718 | #ifdef TC35815_DMA_SYNC_ONDEMAND | ||
1719 | pci_dma_sync_single_for_cpu(lp->pci_dev, | ||
1720 | dma, len, | ||
1721 | PCI_DMA_FROMDEVICE); | ||
1722 | #endif | ||
1723 | memcpy(data + offset, rxbuf, len); | ||
1724 | #ifdef TC35815_DMA_SYNC_ONDEMAND | ||
1725 | pci_dma_sync_single_for_device(lp->pci_dev, | ||
1726 | dma, len, | ||
1727 | PCI_DMA_FROMDEVICE); | ||
1728 | #endif | ||
1729 | offset += len; | ||
1730 | cur_bd++; | ||
1731 | } | ||
1732 | #else /* TC35815_USE_PACKEDBUFFER */ | ||
1733 | BUG_ON(bd_count > 1); | 1521 | BUG_ON(bd_count > 1); |
1734 | cur_bd = (le32_to_cpu(lp->rfd_cur->bd[0].BDCtl) | 1522 | cur_bd = (le32_to_cpu(lp->rfd_cur->bd[0].BDCtl) |
1735 | & BD_RxBDID_MASK) >> BD_RxBDID_SHIFT; | 1523 | & BD_RxBDID_MASK) >> BD_RxBDID_SHIFT; |
@@ -1757,16 +1545,11 @@ tc35815_rx(struct net_device *dev) | |||
1757 | memmove(skb->data, skb->data - NET_IP_ALIGN, | 1545 | memmove(skb->data, skb->data - NET_IP_ALIGN, |
1758 | pkt_len); | 1546 | pkt_len); |
1759 | data = skb_put(skb, pkt_len); | 1547 | data = skb_put(skb, pkt_len); |
1760 | #endif /* TC35815_USE_PACKEDBUFFER */ | ||
1761 | if (netif_msg_pktdata(lp)) | 1548 | if (netif_msg_pktdata(lp)) |
1762 | print_eth(data); | 1549 | print_eth(data); |
1763 | skb->protocol = eth_type_trans(skb, dev); | 1550 | skb->protocol = eth_type_trans(skb, dev); |
1764 | #ifdef TC35815_NAPI | ||
1765 | netif_receive_skb(skb); | 1551 | netif_receive_skb(skb); |
1766 | received++; | 1552 | received++; |
1767 | #else | ||
1768 | netif_rx(skb); | ||
1769 | #endif | ||
1770 | dev->stats.rx_packets++; | 1553 | dev->stats.rx_packets++; |
1771 | dev->stats.rx_bytes += pkt_len; | 1554 | dev->stats.rx_bytes += pkt_len; |
1772 | } else { | 1555 | } else { |
@@ -1803,19 +1586,11 @@ tc35815_rx(struct net_device *dev) | |||
1803 | BUG_ON(id >= RX_BUF_NUM); | 1586 | BUG_ON(id >= RX_BUF_NUM); |
1804 | #endif | 1587 | #endif |
1805 | /* free old buffers */ | 1588 | /* free old buffers */ |
1806 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1807 | while (lp->fbl_curid != id) | ||
1808 | #else | ||
1809 | lp->fbl_count--; | 1589 | lp->fbl_count--; |
1810 | while (lp->fbl_count < RX_BUF_NUM) | 1590 | while (lp->fbl_count < RX_BUF_NUM) |
1811 | #endif | ||
1812 | { | 1591 | { |
1813 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1814 | unsigned char curid = lp->fbl_curid; | ||
1815 | #else | ||
1816 | unsigned char curid = | 1592 | unsigned char curid = |
1817 | (id + 1 + lp->fbl_count) % RX_BUF_NUM; | 1593 | (id + 1 + lp->fbl_count) % RX_BUF_NUM; |
1818 | #endif | ||
1819 | struct BDesc *bd = &lp->fbl_ptr->bd[curid]; | 1594 | struct BDesc *bd = &lp->fbl_ptr->bd[curid]; |
1820 | #ifdef DEBUG | 1595 | #ifdef DEBUG |
1821 | bdctl = le32_to_cpu(bd->BDCtl); | 1596 | bdctl = le32_to_cpu(bd->BDCtl); |
@@ -1826,7 +1601,6 @@ tc35815_rx(struct net_device *dev) | |||
1826 | } | 1601 | } |
1827 | #endif | 1602 | #endif |
1828 | /* pass BD to controller */ | 1603 | /* pass BD to controller */ |
1829 | #ifndef TC35815_USE_PACKEDBUFFER | ||
1830 | if (!lp->rx_skbs[curid].skb) { | 1604 | if (!lp->rx_skbs[curid].skb) { |
1831 | lp->rx_skbs[curid].skb = | 1605 | lp->rx_skbs[curid].skb = |
1832 | alloc_rxbuf_skb(dev, | 1606 | alloc_rxbuf_skb(dev, |
@@ -1836,21 +1610,11 @@ tc35815_rx(struct net_device *dev) | |||
1836 | break; /* try on next reception */ | 1610 | break; /* try on next reception */ |
1837 | bd->BuffData = cpu_to_le32(lp->rx_skbs[curid].skb_dma); | 1611 | bd->BuffData = cpu_to_le32(lp->rx_skbs[curid].skb_dma); |
1838 | } | 1612 | } |
1839 | #endif /* TC35815_USE_PACKEDBUFFER */ | ||
1840 | /* Note: BDLength was modified by chip. */ | 1613 | /* Note: BDLength was modified by chip. */ |
1841 | bd->BDCtl = cpu_to_le32(BD_CownsBD | | 1614 | bd->BDCtl = cpu_to_le32(BD_CownsBD | |
1842 | (curid << BD_RxBDID_SHIFT) | | 1615 | (curid << BD_RxBDID_SHIFT) | |
1843 | RX_BUF_SIZE); | 1616 | RX_BUF_SIZE); |
1844 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1845 | lp->fbl_curid = (curid + 1) % RX_BUF_NUM; | ||
1846 | if (netif_msg_rx_status(lp)) { | ||
1847 | printk("%s: Entering new FBD %d\n", | ||
1848 | dev->name, lp->fbl_curid); | ||
1849 | dump_frfd(lp->fbl_ptr); | ||
1850 | } | ||
1851 | #else | ||
1852 | lp->fbl_count++; | 1617 | lp->fbl_count++; |
1853 | #endif | ||
1854 | } | 1618 | } |
1855 | } | 1619 | } |
1856 | 1620 | ||
@@ -1882,12 +1646,9 @@ tc35815_rx(struct net_device *dev) | |||
1882 | #endif | 1646 | #endif |
1883 | } | 1647 | } |
1884 | 1648 | ||
1885 | #ifdef TC35815_NAPI | ||
1886 | return received; | 1649 | return received; |
1887 | #endif | ||
1888 | } | 1650 | } |
1889 | 1651 | ||
1890 | #ifdef TC35815_NAPI | ||
1891 | static int tc35815_poll(struct napi_struct *napi, int budget) | 1652 | static int tc35815_poll(struct napi_struct *napi, int budget) |
1892 | { | 1653 | { |
1893 | struct tc35815_local *lp = container_of(napi, struct tc35815_local, napi); | 1654 | struct tc35815_local *lp = container_of(napi, struct tc35815_local, napi); |
@@ -1897,7 +1658,7 @@ static int tc35815_poll(struct napi_struct *napi, int budget) | |||
1897 | int received = 0, handled; | 1658 | int received = 0, handled; |
1898 | u32 status; | 1659 | u32 status; |
1899 | 1660 | ||
1900 | spin_lock(&lp->lock); | 1661 | spin_lock(&lp->rx_lock); |
1901 | status = tc_readl(&tr->Int_Src); | 1662 | status = tc_readl(&tr->Int_Src); |
1902 | do { | 1663 | do { |
1903 | /* BLEx, FDAEx will be cleared later */ | 1664 | /* BLEx, FDAEx will be cleared later */ |
@@ -1915,7 +1676,7 @@ static int tc35815_poll(struct napi_struct *napi, int budget) | |||
1915 | } | 1676 | } |
1916 | status = tc_readl(&tr->Int_Src); | 1677 | status = tc_readl(&tr->Int_Src); |
1917 | } while (status); | 1678 | } while (status); |
1918 | spin_unlock(&lp->lock); | 1679 | spin_unlock(&lp->rx_lock); |
1919 | 1680 | ||
1920 | if (received < budget) { | 1681 | if (received < budget) { |
1921 | napi_complete(napi); | 1682 | napi_complete(napi); |
@@ -1924,13 +1685,8 @@ static int tc35815_poll(struct napi_struct *napi, int budget) | |||
1924 | } | 1685 | } |
1925 | return received; | 1686 | return received; |
1926 | } | 1687 | } |
1927 | #endif | ||
1928 | 1688 | ||
1929 | #ifdef NO_CHECK_CARRIER | ||
1930 | #define TX_STA_ERR (Tx_ExColl|Tx_Under|Tx_Defer|Tx_LateColl|Tx_TxPar|Tx_SQErr) | ||
1931 | #else | ||
1932 | #define TX_STA_ERR (Tx_ExColl|Tx_Under|Tx_Defer|Tx_NCarr|Tx_LateColl|Tx_TxPar|Tx_SQErr) | 1689 | #define TX_STA_ERR (Tx_ExColl|Tx_Under|Tx_Defer|Tx_NCarr|Tx_LateColl|Tx_TxPar|Tx_SQErr) |
1933 | #endif | ||
1934 | 1690 | ||
1935 | static void | 1691 | static void |
1936 | tc35815_check_tx_stat(struct net_device *dev, int status) | 1692 | tc35815_check_tx_stat(struct net_device *dev, int status) |
@@ -1944,16 +1700,12 @@ tc35815_check_tx_stat(struct net_device *dev, int status) | |||
1944 | if (status & Tx_TxColl_MASK) | 1700 | if (status & Tx_TxColl_MASK) |
1945 | dev->stats.collisions += status & Tx_TxColl_MASK; | 1701 | dev->stats.collisions += status & Tx_TxColl_MASK; |
1946 | 1702 | ||
1947 | #ifndef NO_CHECK_CARRIER | ||
1948 | /* TX4939 does not have NCarr */ | 1703 | /* TX4939 does not have NCarr */ |
1949 | if (lp->chiptype == TC35815_TX4939) | 1704 | if (lp->chiptype == TC35815_TX4939) |
1950 | status &= ~Tx_NCarr; | 1705 | status &= ~Tx_NCarr; |
1951 | #ifdef WORKAROUND_LOSTCAR | ||
1952 | /* WORKAROUND: ignore LostCrS in full duplex operation */ | 1706 | /* WORKAROUND: ignore LostCrS in full duplex operation */ |
1953 | if (!lp->link || lp->duplex == DUPLEX_FULL) | 1707 | if (!lp->link || lp->duplex == DUPLEX_FULL) |
1954 | status &= ~Tx_NCarr; | 1708 | status &= ~Tx_NCarr; |
1955 | #endif | ||
1956 | #endif | ||
1957 | 1709 | ||
1958 | if (!(status & TX_STA_ERR)) { | 1710 | if (!(status & TX_STA_ERR)) { |
1959 | /* no error. */ | 1711 | /* no error. */ |
@@ -1983,12 +1735,10 @@ tc35815_check_tx_stat(struct net_device *dev, int status) | |||
1983 | dev->stats.tx_fifo_errors++; | 1735 | dev->stats.tx_fifo_errors++; |
1984 | msg = "Excessive Deferral."; | 1736 | msg = "Excessive Deferral."; |
1985 | } | 1737 | } |
1986 | #ifndef NO_CHECK_CARRIER | ||
1987 | if (status & Tx_NCarr) { | 1738 | if (status & Tx_NCarr) { |
1988 | dev->stats.tx_carrier_errors++; | 1739 | dev->stats.tx_carrier_errors++; |
1989 | msg = "Lost Carrier Sense."; | 1740 | msg = "Lost Carrier Sense."; |
1990 | } | 1741 | } |
1991 | #endif | ||
1992 | if (status & Tx_LateColl) { | 1742 | if (status & Tx_LateColl) { |
1993 | dev->stats.tx_aborted_errors++; | 1743 | dev->stats.tx_aborted_errors++; |
1994 | msg = "Late Collision."; | 1744 | msg = "Late Collision."; |
@@ -2044,11 +1794,7 @@ tc35815_txdone(struct net_device *dev) | |||
2044 | pci_unmap_single(lp->pci_dev, lp->tx_skbs[lp->tfd_end].skb_dma, skb->len, PCI_DMA_TODEVICE); | 1794 | pci_unmap_single(lp->pci_dev, lp->tx_skbs[lp->tfd_end].skb_dma, skb->len, PCI_DMA_TODEVICE); |
2045 | lp->tx_skbs[lp->tfd_end].skb = NULL; | 1795 | lp->tx_skbs[lp->tfd_end].skb = NULL; |
2046 | lp->tx_skbs[lp->tfd_end].skb_dma = 0; | 1796 | lp->tx_skbs[lp->tfd_end].skb_dma = 0; |
2047 | #ifdef TC35815_NAPI | ||
2048 | dev_kfree_skb_any(skb); | 1797 | dev_kfree_skb_any(skb); |
2049 | #else | ||
2050 | dev_kfree_skb_irq(skb); | ||
2051 | #endif | ||
2052 | } | 1798 | } |
2053 | txfd->fd.FDSystem = cpu_to_le32(0xffffffff); | 1799 | txfd->fd.FDSystem = cpu_to_le32(0xffffffff); |
2054 | 1800 | ||
@@ -2083,9 +1829,7 @@ tc35815_txdone(struct net_device *dev) | |||
2083 | 1829 | ||
2084 | /* start DMA Transmitter again */ | 1830 | /* start DMA Transmitter again */ |
2085 | txhead->fd.FDNext |= cpu_to_le32(FD_Next_EOL); | 1831 | txhead->fd.FDNext |= cpu_to_le32(FD_Next_EOL); |
2086 | #ifdef GATHER_TXINT | ||
2087 | txhead->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); | 1832 | txhead->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); |
2088 | #endif | ||
2089 | if (netif_msg_tx_queued(lp)) { | 1833 | if (netif_msg_tx_queued(lp)) { |
2090 | printk("%s: start TxFD on queue.\n", | 1834 | printk("%s: start TxFD on queue.\n", |
2091 | dev->name); | 1835 | dev->name); |
@@ -2112,9 +1856,7 @@ tc35815_close(struct net_device *dev) | |||
2112 | struct tc35815_local *lp = netdev_priv(dev); | 1856 | struct tc35815_local *lp = netdev_priv(dev); |
2113 | 1857 | ||
2114 | netif_stop_queue(dev); | 1858 | netif_stop_queue(dev); |
2115 | #ifdef TC35815_NAPI | ||
2116 | napi_disable(&lp->napi); | 1859 | napi_disable(&lp->napi); |
2117 | #endif | ||
2118 | if (lp->phy_dev) | 1860 | if (lp->phy_dev) |
2119 | phy_stop(lp->phy_dev); | 1861 | phy_stop(lp->phy_dev); |
2120 | cancel_work_sync(&lp->restart_work); | 1862 | cancel_work_sync(&lp->restart_work); |
@@ -2198,34 +1940,32 @@ tc35815_set_multicast_list(struct net_device *dev) | |||
2198 | (struct tc35815_regs __iomem *)dev->base_addr; | 1940 | (struct tc35815_regs __iomem *)dev->base_addr; |
2199 | 1941 | ||
2200 | if (dev->flags & IFF_PROMISC) { | 1942 | if (dev->flags & IFF_PROMISC) { |
2201 | #ifdef WORKAROUND_100HALF_PROMISC | ||
2202 | /* With some (all?) 100MHalf HUB, controller will hang | 1943 | /* With some (all?) 100MHalf HUB, controller will hang |
2203 | * if we enabled promiscuous mode before linkup... */ | 1944 | * if we enabled promiscuous mode before linkup... */ |
2204 | struct tc35815_local *lp = netdev_priv(dev); | 1945 | struct tc35815_local *lp = netdev_priv(dev); |
2205 | 1946 | ||
2206 | if (!lp->link) | 1947 | if (!lp->link) |
2207 | return; | 1948 | return; |
2208 | #endif | ||
2209 | /* Enable promiscuous mode */ | 1949 | /* Enable promiscuous mode */ |
2210 | tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc | CAM_StationAcc, &tr->CAM_Ctl); | 1950 | tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc | CAM_StationAcc, &tr->CAM_Ctl); |
2211 | } else if ((dev->flags & IFF_ALLMULTI) || | 1951 | } else if ((dev->flags & IFF_ALLMULTI) || |
2212 | dev->mc_count > CAM_ENTRY_MAX - 3) { | 1952 | netdev_mc_count(dev) > CAM_ENTRY_MAX - 3) { |
2213 | /* CAM 0, 1, 20 are reserved. */ | 1953 | /* CAM 0, 1, 20 are reserved. */ |
2214 | /* Disable promiscuous mode, use normal mode. */ | 1954 | /* Disable promiscuous mode, use normal mode. */ |
2215 | tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc, &tr->CAM_Ctl); | 1955 | tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc, &tr->CAM_Ctl); |
2216 | } else if (dev->mc_count) { | 1956 | } else if (!netdev_mc_empty(dev)) { |
2217 | struct dev_mc_list *cur_addr = dev->mc_list; | 1957 | struct dev_mc_list *cur_addr; |
2218 | int i; | 1958 | int i; |
2219 | int ena_bits = CAM_Ena_Bit(CAM_ENTRY_SOURCE); | 1959 | int ena_bits = CAM_Ena_Bit(CAM_ENTRY_SOURCE); |
2220 | 1960 | ||
2221 | tc_writel(0, &tr->CAM_Ctl); | 1961 | tc_writel(0, &tr->CAM_Ctl); |
2222 | /* Walk the address list, and load the filter */ | 1962 | /* Walk the address list, and load the filter */ |
2223 | for (i = 0; i < dev->mc_count; i++, cur_addr = cur_addr->next) { | 1963 | i = 0; |
2224 | if (!cur_addr) | 1964 | netdev_for_each_mc_addr(cur_addr, dev) { |
2225 | break; | ||
2226 | /* entry 0,1 is reserved. */ | 1965 | /* entry 0,1 is reserved. */ |
2227 | tc35815_set_cam_entry(dev, i + 2, cur_addr->dmi_addr); | 1966 | tc35815_set_cam_entry(dev, i + 2, cur_addr->dmi_addr); |
2228 | ena_bits |= CAM_Ena_Bit(i + 2); | 1967 | ena_bits |= CAM_Ena_Bit(i + 2); |
1968 | i++; | ||
2229 | } | 1969 | } |
2230 | tc_writel(ena_bits, &tr->CAM_Ena); | 1970 | tc_writel(ena_bits, &tr->CAM_Ena); |
2231 | tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl); | 1971 | tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl); |
@@ -2392,9 +2132,6 @@ static void tc35815_chip_init(struct net_device *dev) | |||
2392 | tc_writel(DMA_BURST_SIZE | DMA_RxAlign_2, &tr->DMA_Ctl); | 2132 | tc_writel(DMA_BURST_SIZE | DMA_RxAlign_2, &tr->DMA_Ctl); |
2393 | else | 2133 | else |
2394 | tc_writel(DMA_BURST_SIZE, &tr->DMA_Ctl); | 2134 | tc_writel(DMA_BURST_SIZE, &tr->DMA_Ctl); |
2395 | #ifdef TC35815_USE_PACKEDBUFFER | ||
2396 | tc_writel(RxFrag_EnPack | ETH_ZLEN, &tr->RxFragSize); /* Packing */ | ||
2397 | #endif | ||
2398 | tc_writel(0, &tr->TxPollCtr); /* Batch mode */ | 2135 | tc_writel(0, &tr->TxPollCtr); /* Batch mode */ |
2399 | tc_writel(TX_THRESHOLD, &tr->TxThrsh); | 2136 | tc_writel(TX_THRESHOLD, &tr->TxThrsh); |
2400 | tc_writel(INT_EN_CMD, &tr->Int_En); | 2137 | tc_writel(INT_EN_CMD, &tr->Int_En); |
@@ -2412,19 +2149,12 @@ static void tc35815_chip_init(struct net_device *dev) | |||
2412 | tc_writel(RX_CTL_CMD, &tr->Rx_Ctl); /* start MAC receiver */ | 2149 | tc_writel(RX_CTL_CMD, &tr->Rx_Ctl); /* start MAC receiver */ |
2413 | 2150 | ||
2414 | /* start MAC transmitter */ | 2151 | /* start MAC transmitter */ |
2415 | #ifndef NO_CHECK_CARRIER | ||
2416 | /* TX4939 does not have EnLCarr */ | 2152 | /* TX4939 does not have EnLCarr */ |
2417 | if (lp->chiptype == TC35815_TX4939) | 2153 | if (lp->chiptype == TC35815_TX4939) |
2418 | txctl &= ~Tx_EnLCarr; | 2154 | txctl &= ~Tx_EnLCarr; |
2419 | #ifdef WORKAROUND_LOSTCAR | ||
2420 | /* WORKAROUND: ignore LostCrS in full duplex operation */ | 2155 | /* WORKAROUND: ignore LostCrS in full duplex operation */ |
2421 | if (!lp->phy_dev || !lp->link || lp->duplex == DUPLEX_FULL) | 2156 | if (!lp->phy_dev || !lp->link || lp->duplex == DUPLEX_FULL) |
2422 | txctl &= ~Tx_EnLCarr; | 2157 | txctl &= ~Tx_EnLCarr; |
2423 | #endif | ||
2424 | #endif /* !NO_CHECK_CARRIER */ | ||
2425 | #ifdef GATHER_TXINT | ||
2426 | txctl &= ~Tx_EnComp; /* disable global tx completion int. */ | ||
2427 | #endif | ||
2428 | tc_writel(txctl, &tr->Tx_Ctl); | 2158 | tc_writel(txctl, &tr->Tx_Ctl); |
2429 | } | 2159 | } |
2430 | 2160 | ||