diff options
Diffstat (limited to 'drivers/net/tc35815.c')
-rw-r--r-- | drivers/net/tc35815.c | 292 |
1 files changed, 7 insertions, 285 deletions
diff --git a/drivers/net/tc35815.c b/drivers/net/tc35815.c index d1298e5b72c5..75a669d48e5e 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, |
@@ -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 | ||
@@ -439,11 +413,7 @@ struct tc35815_local { | |||
439 | /* | 413 | /* |
440 | * Transmitting: Batch Mode. | 414 | * Transmitting: Batch Mode. |
441 | * 1 BD in 1 TxFD. | 415 | * 1 BD in 1 TxFD. |
442 | * Receiving: Packing Mode. (TC35815_USE_PACKEDBUFFER) | 416 | * 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. | 417 | * 1 circular FD for Free Buffer List. |
448 | * RX_BUF_NUM BD in Free Buffer FD. | 418 | * RX_BUF_NUM BD in Free Buffer FD. |
449 | * One Free Buffer BD has ETH_FRAME_LEN data buffer. | 419 | * One Free Buffer BD has ETH_FRAME_LEN data buffer. |
@@ -457,21 +427,11 @@ struct tc35815_local { | |||
457 | struct RxFD *rfd_limit; | 427 | struct RxFD *rfd_limit; |
458 | struct RxFD *rfd_cur; | 428 | struct RxFD *rfd_cur; |
459 | struct FrFD *fbl_ptr; | 429 | 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; | 430 | unsigned int fbl_count; |
470 | struct { | 431 | struct { |
471 | struct sk_buff *skb; | 432 | struct sk_buff *skb; |
472 | dma_addr_t skb_dma; | 433 | dma_addr_t skb_dma; |
473 | } tx_skbs[TX_FD_NUM], rx_skbs[RX_BUF_NUM]; | 434 | } tx_skbs[TX_FD_NUM], rx_skbs[RX_BUF_NUM]; |
474 | #endif | ||
475 | u32 msg_enable; | 435 | u32 msg_enable; |
476 | enum tc35815_chiptype chiptype; | 436 | enum tc35815_chiptype chiptype; |
477 | }; | 437 | }; |
@@ -486,51 +446,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)); | 446 | return (void *)((u8 *)lp->fd_buf + (bus - lp->fd_buf_dma)); |
487 | } | 447 | } |
488 | #endif | 448 | #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, | 449 | static struct sk_buff *alloc_rxbuf_skb(struct net_device *dev, |
535 | struct pci_dev *hwdev, | 450 | struct pci_dev *hwdev, |
536 | dma_addr_t *dma_handle) | 451 | dma_addr_t *dma_handle) |
@@ -555,19 +470,14 @@ static void free_rxbuf_skb(struct pci_dev *hwdev, struct sk_buff *skb, dma_addr_ | |||
555 | PCI_DMA_FROMDEVICE); | 470 | PCI_DMA_FROMDEVICE); |
556 | dev_kfree_skb_any(skb); | 471 | dev_kfree_skb_any(skb); |
557 | } | 472 | } |
558 | #endif /* TC35815_USE_PACKEDBUFFER */ | ||
559 | 473 | ||
560 | /* Index to functions, as function prototypes. */ | 474 | /* Index to functions, as function prototypes. */ |
561 | 475 | ||
562 | static int tc35815_open(struct net_device *dev); | 476 | static int tc35815_open(struct net_device *dev); |
563 | static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev); | 477 | static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev); |
564 | static irqreturn_t tc35815_interrupt(int irq, void *dev_id); | 478 | 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); | 479 | static int tc35815_rx(struct net_device *dev, int limit); |
567 | static int tc35815_poll(struct napi_struct *napi, int budget); | 480 | 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); | 481 | static void tc35815_txdone(struct net_device *dev); |
572 | static int tc35815_close(struct net_device *dev); | 482 | static int tc35815_close(struct net_device *dev); |
573 | static struct net_device_stats *tc35815_get_stats(struct net_device *dev); | 483 | static struct net_device_stats *tc35815_get_stats(struct net_device *dev); |
@@ -654,8 +564,6 @@ static void tc_handle_link_change(struct net_device *dev) | |||
654 | * TX4939 PCFG.SPEEDn bit will be changed on | 564 | * TX4939 PCFG.SPEEDn bit will be changed on |
655 | * NETDEV_CHANGE event. | 565 | * NETDEV_CHANGE event. |
656 | */ | 566 | */ |
657 | |||
658 | #if !defined(NO_CHECK_CARRIER) && defined(WORKAROUND_LOSTCAR) | ||
659 | /* | 567 | /* |
660 | * WORKAROUND: enable LostCrS only if half duplex | 568 | * WORKAROUND: enable LostCrS only if half duplex |
661 | * operation. | 569 | * operation. |
@@ -665,7 +573,6 @@ static void tc_handle_link_change(struct net_device *dev) | |||
665 | lp->chiptype != TC35815_TX4939) | 573 | lp->chiptype != TC35815_TX4939) |
666 | tc_writel(tc_readl(&tr->Tx_Ctl) | Tx_EnLCarr, | 574 | tc_writel(tc_readl(&tr->Tx_Ctl) | Tx_EnLCarr, |
667 | &tr->Tx_Ctl); | 575 | &tr->Tx_Ctl); |
668 | #endif | ||
669 | 576 | ||
670 | lp->speed = phydev->speed; | 577 | lp->speed = phydev->speed; |
671 | lp->duplex = phydev->duplex; | 578 | lp->duplex = phydev->duplex; |
@@ -674,11 +581,9 @@ static void tc_handle_link_change(struct net_device *dev) | |||
674 | 581 | ||
675 | if (phydev->link != lp->link) { | 582 | if (phydev->link != lp->link) { |
676 | if (phydev->link) { | 583 | if (phydev->link) { |
677 | #ifdef WORKAROUND_100HALF_PROMISC | ||
678 | /* delayed promiscuous enabling */ | 584 | /* delayed promiscuous enabling */ |
679 | if (dev->flags & IFF_PROMISC) | 585 | if (dev->flags & IFF_PROMISC) |
680 | tc35815_set_multicast_list(dev); | 586 | tc35815_set_multicast_list(dev); |
681 | #endif | ||
682 | } else { | 587 | } else { |
683 | lp->speed = 0; | 588 | lp->speed = 0; |
684 | lp->duplex = -1; | 589 | lp->duplex = -1; |
@@ -923,9 +828,7 @@ static int __devinit tc35815_init_one(struct pci_dev *pdev, | |||
923 | dev->netdev_ops = &tc35815_netdev_ops; | 828 | dev->netdev_ops = &tc35815_netdev_ops; |
924 | dev->ethtool_ops = &tc35815_ethtool_ops; | 829 | dev->ethtool_ops = &tc35815_ethtool_ops; |
925 | dev->watchdog_timeo = TC35815_TX_TIMEOUT; | 830 | dev->watchdog_timeo = TC35815_TX_TIMEOUT; |
926 | #ifdef TC35815_NAPI | ||
927 | netif_napi_add(dev, &lp->napi, tc35815_poll, NAPI_WEIGHT); | 831 | netif_napi_add(dev, &lp->napi, tc35815_poll, NAPI_WEIGHT); |
928 | #endif | ||
929 | 832 | ||
930 | dev->irq = pdev->irq; | 833 | dev->irq = pdev->irq; |
931 | dev->base_addr = (unsigned long)ioaddr; | 834 | dev->base_addr = (unsigned long)ioaddr; |
@@ -1007,25 +910,6 @@ tc35815_init_queues(struct net_device *dev) | |||
1007 | if (!lp->fd_buf) | 910 | if (!lp->fd_buf) |
1008 | return -ENOMEM; | 911 | return -ENOMEM; |
1009 | for (i = 0; i < RX_BUF_NUM; i++) { | 912 | 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 = | 913 | lp->rx_skbs[i].skb = |
1030 | alloc_rxbuf_skb(dev, lp->pci_dev, | 914 | alloc_rxbuf_skb(dev, lp->pci_dev, |
1031 | &lp->rx_skbs[i].skb_dma); | 915 | &lp->rx_skbs[i].skb_dma); |
@@ -1043,15 +927,9 @@ tc35815_init_queues(struct net_device *dev) | |||
1043 | lp->fd_buf = NULL; | 927 | lp->fd_buf = NULL; |
1044 | return -ENOMEM; | 928 | return -ENOMEM; |
1045 | } | 929 | } |
1046 | #endif | ||
1047 | } | 930 | } |
1048 | printk(KERN_DEBUG "%s: FD buf %p DataBuf", | 931 | printk(KERN_DEBUG "%s: FD buf %p DataBuf", |
1049 | dev->name, lp->fd_buf); | 932 | 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"); | 933 | printk("\n"); |
1056 | } else { | 934 | } else { |
1057 | for (i = 0; i < FD_PAGE_NUM; i++) | 935 | for (i = 0; i < FD_PAGE_NUM; i++) |
@@ -1084,7 +962,6 @@ tc35815_init_queues(struct net_device *dev) | |||
1084 | lp->fbl_ptr = (struct FrFD *)fd_addr; | 962 | lp->fbl_ptr = (struct FrFD *)fd_addr; |
1085 | lp->fbl_ptr->fd.FDNext = cpu_to_le32(fd_virt_to_bus(lp, lp->fbl_ptr)); | 963 | 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); | 964 | lp->fbl_ptr->fd.FDCtl = cpu_to_le32(RX_BUF_NUM | FD_CownsFD); |
1087 | #ifndef TC35815_USE_PACKEDBUFFER | ||
1088 | /* | 965 | /* |
1089 | * move all allocated skbs to head of rx_skbs[] array. | 966 | * move all allocated skbs to head of rx_skbs[] array. |
1090 | * fbl_count mighe not be RX_BUF_NUM if alloc_rxbuf_skb() in | 967 | * fbl_count mighe not be RX_BUF_NUM if alloc_rxbuf_skb() in |
@@ -1102,11 +979,7 @@ tc35815_init_queues(struct net_device *dev) | |||
1102 | lp->fbl_count++; | 979 | lp->fbl_count++; |
1103 | } | 980 | } |
1104 | } | 981 | } |
1105 | #endif | ||
1106 | for (i = 0; i < RX_BUF_NUM; i++) { | 982 | 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) { | 983 | if (i >= lp->fbl_count) { |
1111 | lp->fbl_ptr->bd[i].BuffData = 0; | 984 | lp->fbl_ptr->bd[i].BuffData = 0; |
1112 | lp->fbl_ptr->bd[i].BDCtl = 0; | 985 | lp->fbl_ptr->bd[i].BDCtl = 0; |
@@ -1114,15 +987,11 @@ tc35815_init_queues(struct net_device *dev) | |||
1114 | } | 987 | } |
1115 | lp->fbl_ptr->bd[i].BuffData = | 988 | lp->fbl_ptr->bd[i].BuffData = |
1116 | cpu_to_le32(lp->rx_skbs[i].skb_dma); | 989 | cpu_to_le32(lp->rx_skbs[i].skb_dma); |
1117 | #endif | ||
1118 | /* BDID is index of FrFD.bd[] */ | 990 | /* BDID is index of FrFD.bd[] */ |
1119 | lp->fbl_ptr->bd[i].BDCtl = | 991 | lp->fbl_ptr->bd[i].BDCtl = |
1120 | cpu_to_le32(BD_CownsBD | (i << BD_RxBDID_SHIFT) | | 992 | cpu_to_le32(BD_CownsBD | (i << BD_RxBDID_SHIFT) | |
1121 | RX_BUF_SIZE); | 993 | RX_BUF_SIZE); |
1122 | } | 994 | } |
1123 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1124 | lp->fbl_curid = 0; | ||
1125 | #endif | ||
1126 | 995 | ||
1127 | printk(KERN_DEBUG "%s: TxFD %p RxFD %p FrFD %p\n", | 996 | printk(KERN_DEBUG "%s: TxFD %p RxFD %p FrFD %p\n", |
1128 | dev->name, lp->tfd_base, lp->rfd_base, lp->fbl_ptr); | 997 | dev->name, lp->tfd_base, lp->rfd_base, lp->fbl_ptr); |
@@ -1196,19 +1065,11 @@ tc35815_free_queues(struct net_device *dev) | |||
1196 | lp->fbl_ptr = NULL; | 1065 | lp->fbl_ptr = NULL; |
1197 | 1066 | ||
1198 | for (i = 0; i < RX_BUF_NUM; i++) { | 1067 | 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) { | 1068 | if (lp->rx_skbs[i].skb) { |
1207 | free_rxbuf_skb(lp->pci_dev, lp->rx_skbs[i].skb, | 1069 | free_rxbuf_skb(lp->pci_dev, lp->rx_skbs[i].skb, |
1208 | lp->rx_skbs[i].skb_dma); | 1070 | lp->rx_skbs[i].skb_dma); |
1209 | lp->rx_skbs[i].skb = NULL; | 1071 | lp->rx_skbs[i].skb = NULL; |
1210 | } | 1072 | } |
1211 | #endif | ||
1212 | } | 1073 | } |
1213 | if (lp->fd_buf) { | 1074 | if (lp->fd_buf) { |
1214 | pci_free_consistent(lp->pci_dev, PAGE_SIZE * FD_PAGE_NUM, | 1075 | pci_free_consistent(lp->pci_dev, PAGE_SIZE * FD_PAGE_NUM, |
@@ -1254,7 +1115,7 @@ dump_rxfd(struct RxFD *fd) | |||
1254 | return bd_count; | 1115 | return bd_count; |
1255 | } | 1116 | } |
1256 | 1117 | ||
1257 | #if defined(DEBUG) || defined(TC35815_USE_PACKEDBUFFER) | 1118 | #ifdef DEBUG |
1258 | static void | 1119 | static void |
1259 | dump_frfd(struct FrFD *fd) | 1120 | dump_frfd(struct FrFD *fd) |
1260 | { | 1121 | { |
@@ -1271,9 +1132,7 @@ dump_frfd(struct FrFD *fd) | |||
1271 | le32_to_cpu(fd->bd[i].BDCtl)); | 1132 | le32_to_cpu(fd->bd[i].BDCtl)); |
1272 | printk("\n"); | 1133 | printk("\n"); |
1273 | } | 1134 | } |
1274 | #endif | ||
1275 | 1135 | ||
1276 | #ifdef DEBUG | ||
1277 | static void | 1136 | static void |
1278 | panic_queues(struct net_device *dev) | 1137 | panic_queues(struct net_device *dev) |
1279 | { | 1138 | { |
@@ -1389,7 +1248,7 @@ tc35815_open(struct net_device *dev) | |||
1389 | * This is used if the interrupt line can turned off (shared). | 1248 | * 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. | 1249 | * See 3c503.c for an example of selecting the IRQ at config-time. |
1391 | */ | 1250 | */ |
1392 | if (request_irq(dev->irq, &tc35815_interrupt, IRQF_SHARED, | 1251 | if (request_irq(dev->irq, tc35815_interrupt, IRQF_SHARED, |
1393 | dev->name, dev)) | 1252 | dev->name, dev)) |
1394 | return -EAGAIN; | 1253 | return -EAGAIN; |
1395 | 1254 | ||
@@ -1400,9 +1259,7 @@ tc35815_open(struct net_device *dev) | |||
1400 | return -EAGAIN; | 1259 | return -EAGAIN; |
1401 | } | 1260 | } |
1402 | 1261 | ||
1403 | #ifdef TC35815_NAPI | ||
1404 | napi_enable(&lp->napi); | 1262 | napi_enable(&lp->napi); |
1405 | #endif | ||
1406 | 1263 | ||
1407 | /* Reset the hardware here. Don't forget to set the station address. */ | 1264 | /* Reset the hardware here. Don't forget to set the station address. */ |
1408 | spin_lock_irq(&lp->lock); | 1265 | spin_lock_irq(&lp->lock); |
@@ -1478,9 +1335,7 @@ static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev) | |||
1478 | (struct tc35815_regs __iomem *)dev->base_addr; | 1335 | (struct tc35815_regs __iomem *)dev->base_addr; |
1479 | /* Start DMA Transmitter. */ | 1336 | /* Start DMA Transmitter. */ |
1480 | txfd->fd.FDNext |= cpu_to_le32(FD_Next_EOL); | 1337 | txfd->fd.FDNext |= cpu_to_le32(FD_Next_EOL); |
1481 | #ifdef GATHER_TXINT | ||
1482 | txfd->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); | 1338 | txfd->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); |
1483 | #endif | ||
1484 | if (netif_msg_tx_queued(lp)) { | 1339 | if (netif_msg_tx_queued(lp)) { |
1485 | printk("%s: starting TxFD.\n", dev->name); | 1340 | printk("%s: starting TxFD.\n", dev->name); |
1486 | dump_txfd(txfd); | 1341 | dump_txfd(txfd); |
@@ -1536,11 +1391,7 @@ static void tc35815_fatal_error_interrupt(struct net_device *dev, u32 status) | |||
1536 | tc35815_schedule_restart(dev); | 1391 | tc35815_schedule_restart(dev); |
1537 | } | 1392 | } |
1538 | 1393 | ||
1539 | #ifdef TC35815_NAPI | ||
1540 | static int tc35815_do_interrupt(struct net_device *dev, u32 status, int limit) | 1394 | 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 | { | 1395 | { |
1545 | struct tc35815_local *lp = netdev_priv(dev); | 1396 | struct tc35815_local *lp = netdev_priv(dev); |
1546 | int ret = -1; | 1397 | int ret = -1; |
@@ -1579,12 +1430,7 @@ static int tc35815_do_interrupt(struct net_device *dev, u32 status) | |||
1579 | /* normal notification */ | 1430 | /* normal notification */ |
1580 | if (status & Int_IntMacRx) { | 1431 | if (status & Int_IntMacRx) { |
1581 | /* Got a packet(s). */ | 1432 | /* Got a packet(s). */ |
1582 | #ifdef TC35815_NAPI | ||
1583 | ret = tc35815_rx(dev, limit); | 1433 | ret = tc35815_rx(dev, limit); |
1584 | #else | ||
1585 | tc35815_rx(dev); | ||
1586 | ret = 0; | ||
1587 | #endif | ||
1588 | lp->lstats.rx_ints++; | 1434 | lp->lstats.rx_ints++; |
1589 | } | 1435 | } |
1590 | if (status & Int_IntMacTx) { | 1436 | if (status & Int_IntMacTx) { |
@@ -1592,7 +1438,8 @@ static int tc35815_do_interrupt(struct net_device *dev, u32 status) | |||
1592 | lp->lstats.tx_ints++; | 1438 | lp->lstats.tx_ints++; |
1593 | tc35815_txdone(dev); | 1439 | tc35815_txdone(dev); |
1594 | netif_wake_queue(dev); | 1440 | netif_wake_queue(dev); |
1595 | ret = 0; | 1441 | if (ret < 0) |
1442 | ret = 0; | ||
1596 | } | 1443 | } |
1597 | return ret; | 1444 | return ret; |
1598 | } | 1445 | } |
@@ -1607,7 +1454,6 @@ static irqreturn_t tc35815_interrupt(int irq, void *dev_id) | |||
1607 | struct tc35815_local *lp = netdev_priv(dev); | 1454 | struct tc35815_local *lp = netdev_priv(dev); |
1608 | struct tc35815_regs __iomem *tr = | 1455 | struct tc35815_regs __iomem *tr = |
1609 | (struct tc35815_regs __iomem *)dev->base_addr; | 1456 | (struct tc35815_regs __iomem *)dev->base_addr; |
1610 | #ifdef TC35815_NAPI | ||
1611 | u32 dmactl = tc_readl(&tr->DMA_Ctl); | 1457 | u32 dmactl = tc_readl(&tr->DMA_Ctl); |
1612 | 1458 | ||
1613 | if (!(dmactl & DMA_IntMask)) { | 1459 | if (!(dmactl & DMA_IntMask)) { |
@@ -1624,22 +1470,6 @@ static irqreturn_t tc35815_interrupt(int irq, void *dev_id) | |||
1624 | return IRQ_HANDLED; | 1470 | return IRQ_HANDLED; |
1625 | } | 1471 | } |
1626 | return IRQ_NONE; | 1472 | 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 | } | 1473 | } |
1644 | 1474 | ||
1645 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1475 | #ifdef CONFIG_NET_POLL_CONTROLLER |
@@ -1652,20 +1482,13 @@ static void tc35815_poll_controller(struct net_device *dev) | |||
1652 | #endif | 1482 | #endif |
1653 | 1483 | ||
1654 | /* We have a good packet(s), get it/them out of the buffers. */ | 1484 | /* We have a good packet(s), get it/them out of the buffers. */ |
1655 | #ifdef TC35815_NAPI | ||
1656 | static int | 1485 | static int |
1657 | tc35815_rx(struct net_device *dev, int limit) | 1486 | tc35815_rx(struct net_device *dev, int limit) |
1658 | #else | ||
1659 | static void | ||
1660 | tc35815_rx(struct net_device *dev) | ||
1661 | #endif | ||
1662 | { | 1487 | { |
1663 | struct tc35815_local *lp = netdev_priv(dev); | 1488 | struct tc35815_local *lp = netdev_priv(dev); |
1664 | unsigned int fdctl; | 1489 | unsigned int fdctl; |
1665 | int i; | 1490 | int i; |
1666 | #ifdef TC35815_NAPI | ||
1667 | int received = 0; | 1491 | int received = 0; |
1668 | #endif | ||
1669 | 1492 | ||
1670 | while (!((fdctl = le32_to_cpu(lp->rfd_cur->fd.FDCtl)) & FD_CownsFD)) { | 1493 | while (!((fdctl = le32_to_cpu(lp->rfd_cur->fd.FDCtl)) & FD_CownsFD)) { |
1671 | int status = le32_to_cpu(lp->rfd_cur->fd.FDStat); | 1494 | int status = le32_to_cpu(lp->rfd_cur->fd.FDStat); |
@@ -1684,52 +1507,9 @@ tc35815_rx(struct net_device *dev) | |||
1684 | struct sk_buff *skb; | 1507 | struct sk_buff *skb; |
1685 | unsigned char *data; | 1508 | unsigned char *data; |
1686 | int cur_bd; | 1509 | int cur_bd; |
1687 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1688 | int offset; | ||
1689 | #endif | ||
1690 | 1510 | ||
1691 | #ifdef TC35815_NAPI | ||
1692 | if (--limit < 0) | 1511 | if (--limit < 0) |
1693 | break; | 1512 | 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); | 1513 | BUG_ON(bd_count > 1); |
1734 | cur_bd = (le32_to_cpu(lp->rfd_cur->bd[0].BDCtl) | 1514 | cur_bd = (le32_to_cpu(lp->rfd_cur->bd[0].BDCtl) |
1735 | & BD_RxBDID_MASK) >> BD_RxBDID_SHIFT; | 1515 | & BD_RxBDID_MASK) >> BD_RxBDID_SHIFT; |
@@ -1757,16 +1537,11 @@ tc35815_rx(struct net_device *dev) | |||
1757 | memmove(skb->data, skb->data - NET_IP_ALIGN, | 1537 | memmove(skb->data, skb->data - NET_IP_ALIGN, |
1758 | pkt_len); | 1538 | pkt_len); |
1759 | data = skb_put(skb, pkt_len); | 1539 | data = skb_put(skb, pkt_len); |
1760 | #endif /* TC35815_USE_PACKEDBUFFER */ | ||
1761 | if (netif_msg_pktdata(lp)) | 1540 | if (netif_msg_pktdata(lp)) |
1762 | print_eth(data); | 1541 | print_eth(data); |
1763 | skb->protocol = eth_type_trans(skb, dev); | 1542 | skb->protocol = eth_type_trans(skb, dev); |
1764 | #ifdef TC35815_NAPI | ||
1765 | netif_receive_skb(skb); | 1543 | netif_receive_skb(skb); |
1766 | received++; | 1544 | received++; |
1767 | #else | ||
1768 | netif_rx(skb); | ||
1769 | #endif | ||
1770 | dev->stats.rx_packets++; | 1545 | dev->stats.rx_packets++; |
1771 | dev->stats.rx_bytes += pkt_len; | 1546 | dev->stats.rx_bytes += pkt_len; |
1772 | } else { | 1547 | } else { |
@@ -1803,19 +1578,11 @@ tc35815_rx(struct net_device *dev) | |||
1803 | BUG_ON(id >= RX_BUF_NUM); | 1578 | BUG_ON(id >= RX_BUF_NUM); |
1804 | #endif | 1579 | #endif |
1805 | /* free old buffers */ | 1580 | /* free old buffers */ |
1806 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1807 | while (lp->fbl_curid != id) | ||
1808 | #else | ||
1809 | lp->fbl_count--; | 1581 | lp->fbl_count--; |
1810 | while (lp->fbl_count < RX_BUF_NUM) | 1582 | while (lp->fbl_count < RX_BUF_NUM) |
1811 | #endif | ||
1812 | { | 1583 | { |
1813 | #ifdef TC35815_USE_PACKEDBUFFER | ||
1814 | unsigned char curid = lp->fbl_curid; | ||
1815 | #else | ||
1816 | unsigned char curid = | 1584 | unsigned char curid = |
1817 | (id + 1 + lp->fbl_count) % RX_BUF_NUM; | 1585 | (id + 1 + lp->fbl_count) % RX_BUF_NUM; |
1818 | #endif | ||
1819 | struct BDesc *bd = &lp->fbl_ptr->bd[curid]; | 1586 | struct BDesc *bd = &lp->fbl_ptr->bd[curid]; |
1820 | #ifdef DEBUG | 1587 | #ifdef DEBUG |
1821 | bdctl = le32_to_cpu(bd->BDCtl); | 1588 | bdctl = le32_to_cpu(bd->BDCtl); |
@@ -1826,7 +1593,6 @@ tc35815_rx(struct net_device *dev) | |||
1826 | } | 1593 | } |
1827 | #endif | 1594 | #endif |
1828 | /* pass BD to controller */ | 1595 | /* pass BD to controller */ |
1829 | #ifndef TC35815_USE_PACKEDBUFFER | ||
1830 | if (!lp->rx_skbs[curid].skb) { | 1596 | if (!lp->rx_skbs[curid].skb) { |
1831 | lp->rx_skbs[curid].skb = | 1597 | lp->rx_skbs[curid].skb = |
1832 | alloc_rxbuf_skb(dev, | 1598 | alloc_rxbuf_skb(dev, |
@@ -1836,21 +1602,11 @@ tc35815_rx(struct net_device *dev) | |||
1836 | break; /* try on next reception */ | 1602 | break; /* try on next reception */ |
1837 | bd->BuffData = cpu_to_le32(lp->rx_skbs[curid].skb_dma); | 1603 | bd->BuffData = cpu_to_le32(lp->rx_skbs[curid].skb_dma); |
1838 | } | 1604 | } |
1839 | #endif /* TC35815_USE_PACKEDBUFFER */ | ||
1840 | /* Note: BDLength was modified by chip. */ | 1605 | /* Note: BDLength was modified by chip. */ |
1841 | bd->BDCtl = cpu_to_le32(BD_CownsBD | | 1606 | bd->BDCtl = cpu_to_le32(BD_CownsBD | |
1842 | (curid << BD_RxBDID_SHIFT) | | 1607 | (curid << BD_RxBDID_SHIFT) | |
1843 | RX_BUF_SIZE); | 1608 | 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++; | 1609 | lp->fbl_count++; |
1853 | #endif | ||
1854 | } | 1610 | } |
1855 | } | 1611 | } |
1856 | 1612 | ||
@@ -1882,12 +1638,9 @@ tc35815_rx(struct net_device *dev) | |||
1882 | #endif | 1638 | #endif |
1883 | } | 1639 | } |
1884 | 1640 | ||
1885 | #ifdef TC35815_NAPI | ||
1886 | return received; | 1641 | return received; |
1887 | #endif | ||
1888 | } | 1642 | } |
1889 | 1643 | ||
1890 | #ifdef TC35815_NAPI | ||
1891 | static int tc35815_poll(struct napi_struct *napi, int budget) | 1644 | static int tc35815_poll(struct napi_struct *napi, int budget) |
1892 | { | 1645 | { |
1893 | struct tc35815_local *lp = container_of(napi, struct tc35815_local, napi); | 1646 | struct tc35815_local *lp = container_of(napi, struct tc35815_local, napi); |
@@ -1924,13 +1677,8 @@ static int tc35815_poll(struct napi_struct *napi, int budget) | |||
1924 | } | 1677 | } |
1925 | return received; | 1678 | return received; |
1926 | } | 1679 | } |
1927 | #endif | ||
1928 | 1680 | ||
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) | 1681 | #define TX_STA_ERR (Tx_ExColl|Tx_Under|Tx_Defer|Tx_NCarr|Tx_LateColl|Tx_TxPar|Tx_SQErr) |
1933 | #endif | ||
1934 | 1682 | ||
1935 | static void | 1683 | static void |
1936 | tc35815_check_tx_stat(struct net_device *dev, int status) | 1684 | tc35815_check_tx_stat(struct net_device *dev, int status) |
@@ -1944,16 +1692,12 @@ tc35815_check_tx_stat(struct net_device *dev, int status) | |||
1944 | if (status & Tx_TxColl_MASK) | 1692 | if (status & Tx_TxColl_MASK) |
1945 | dev->stats.collisions += status & Tx_TxColl_MASK; | 1693 | dev->stats.collisions += status & Tx_TxColl_MASK; |
1946 | 1694 | ||
1947 | #ifndef NO_CHECK_CARRIER | ||
1948 | /* TX4939 does not have NCarr */ | 1695 | /* TX4939 does not have NCarr */ |
1949 | if (lp->chiptype == TC35815_TX4939) | 1696 | if (lp->chiptype == TC35815_TX4939) |
1950 | status &= ~Tx_NCarr; | 1697 | status &= ~Tx_NCarr; |
1951 | #ifdef WORKAROUND_LOSTCAR | ||
1952 | /* WORKAROUND: ignore LostCrS in full duplex operation */ | 1698 | /* WORKAROUND: ignore LostCrS in full duplex operation */ |
1953 | if (!lp->link || lp->duplex == DUPLEX_FULL) | 1699 | if (!lp->link || lp->duplex == DUPLEX_FULL) |
1954 | status &= ~Tx_NCarr; | 1700 | status &= ~Tx_NCarr; |
1955 | #endif | ||
1956 | #endif | ||
1957 | 1701 | ||
1958 | if (!(status & TX_STA_ERR)) { | 1702 | if (!(status & TX_STA_ERR)) { |
1959 | /* no error. */ | 1703 | /* no error. */ |
@@ -1983,12 +1727,10 @@ tc35815_check_tx_stat(struct net_device *dev, int status) | |||
1983 | dev->stats.tx_fifo_errors++; | 1727 | dev->stats.tx_fifo_errors++; |
1984 | msg = "Excessive Deferral."; | 1728 | msg = "Excessive Deferral."; |
1985 | } | 1729 | } |
1986 | #ifndef NO_CHECK_CARRIER | ||
1987 | if (status & Tx_NCarr) { | 1730 | if (status & Tx_NCarr) { |
1988 | dev->stats.tx_carrier_errors++; | 1731 | dev->stats.tx_carrier_errors++; |
1989 | msg = "Lost Carrier Sense."; | 1732 | msg = "Lost Carrier Sense."; |
1990 | } | 1733 | } |
1991 | #endif | ||
1992 | if (status & Tx_LateColl) { | 1734 | if (status & Tx_LateColl) { |
1993 | dev->stats.tx_aborted_errors++; | 1735 | dev->stats.tx_aborted_errors++; |
1994 | msg = "Late Collision."; | 1736 | msg = "Late Collision."; |
@@ -2044,11 +1786,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); | 1786 | 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; | 1787 | lp->tx_skbs[lp->tfd_end].skb = NULL; |
2046 | lp->tx_skbs[lp->tfd_end].skb_dma = 0; | 1788 | lp->tx_skbs[lp->tfd_end].skb_dma = 0; |
2047 | #ifdef TC35815_NAPI | ||
2048 | dev_kfree_skb_any(skb); | 1789 | dev_kfree_skb_any(skb); |
2049 | #else | ||
2050 | dev_kfree_skb_irq(skb); | ||
2051 | #endif | ||
2052 | } | 1790 | } |
2053 | txfd->fd.FDSystem = cpu_to_le32(0xffffffff); | 1791 | txfd->fd.FDSystem = cpu_to_le32(0xffffffff); |
2054 | 1792 | ||
@@ -2083,9 +1821,7 @@ tc35815_txdone(struct net_device *dev) | |||
2083 | 1821 | ||
2084 | /* start DMA Transmitter again */ | 1822 | /* start DMA Transmitter again */ |
2085 | txhead->fd.FDNext |= cpu_to_le32(FD_Next_EOL); | 1823 | txhead->fd.FDNext |= cpu_to_le32(FD_Next_EOL); |
2086 | #ifdef GATHER_TXINT | ||
2087 | txhead->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); | 1824 | txhead->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); |
2088 | #endif | ||
2089 | if (netif_msg_tx_queued(lp)) { | 1825 | if (netif_msg_tx_queued(lp)) { |
2090 | printk("%s: start TxFD on queue.\n", | 1826 | printk("%s: start TxFD on queue.\n", |
2091 | dev->name); | 1827 | dev->name); |
@@ -2112,9 +1848,7 @@ tc35815_close(struct net_device *dev) | |||
2112 | struct tc35815_local *lp = netdev_priv(dev); | 1848 | struct tc35815_local *lp = netdev_priv(dev); |
2113 | 1849 | ||
2114 | netif_stop_queue(dev); | 1850 | netif_stop_queue(dev); |
2115 | #ifdef TC35815_NAPI | ||
2116 | napi_disable(&lp->napi); | 1851 | napi_disable(&lp->napi); |
2117 | #endif | ||
2118 | if (lp->phy_dev) | 1852 | if (lp->phy_dev) |
2119 | phy_stop(lp->phy_dev); | 1853 | phy_stop(lp->phy_dev); |
2120 | cancel_work_sync(&lp->restart_work); | 1854 | cancel_work_sync(&lp->restart_work); |
@@ -2198,14 +1932,12 @@ tc35815_set_multicast_list(struct net_device *dev) | |||
2198 | (struct tc35815_regs __iomem *)dev->base_addr; | 1932 | (struct tc35815_regs __iomem *)dev->base_addr; |
2199 | 1933 | ||
2200 | if (dev->flags & IFF_PROMISC) { | 1934 | if (dev->flags & IFF_PROMISC) { |
2201 | #ifdef WORKAROUND_100HALF_PROMISC | ||
2202 | /* With some (all?) 100MHalf HUB, controller will hang | 1935 | /* With some (all?) 100MHalf HUB, controller will hang |
2203 | * if we enabled promiscuous mode before linkup... */ | 1936 | * if we enabled promiscuous mode before linkup... */ |
2204 | struct tc35815_local *lp = netdev_priv(dev); | 1937 | struct tc35815_local *lp = netdev_priv(dev); |
2205 | 1938 | ||
2206 | if (!lp->link) | 1939 | if (!lp->link) |
2207 | return; | 1940 | return; |
2208 | #endif | ||
2209 | /* Enable promiscuous mode */ | 1941 | /* Enable promiscuous mode */ |
2210 | tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc | CAM_StationAcc, &tr->CAM_Ctl); | 1942 | tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc | CAM_StationAcc, &tr->CAM_Ctl); |
2211 | } else if ((dev->flags & IFF_ALLMULTI) || | 1943 | } else if ((dev->flags & IFF_ALLMULTI) || |
@@ -2392,9 +2124,6 @@ static void tc35815_chip_init(struct net_device *dev) | |||
2392 | tc_writel(DMA_BURST_SIZE | DMA_RxAlign_2, &tr->DMA_Ctl); | 2124 | tc_writel(DMA_BURST_SIZE | DMA_RxAlign_2, &tr->DMA_Ctl); |
2393 | else | 2125 | else |
2394 | tc_writel(DMA_BURST_SIZE, &tr->DMA_Ctl); | 2126 | 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 */ | 2127 | tc_writel(0, &tr->TxPollCtr); /* Batch mode */ |
2399 | tc_writel(TX_THRESHOLD, &tr->TxThrsh); | 2128 | tc_writel(TX_THRESHOLD, &tr->TxThrsh); |
2400 | tc_writel(INT_EN_CMD, &tr->Int_En); | 2129 | tc_writel(INT_EN_CMD, &tr->Int_En); |
@@ -2412,19 +2141,12 @@ static void tc35815_chip_init(struct net_device *dev) | |||
2412 | tc_writel(RX_CTL_CMD, &tr->Rx_Ctl); /* start MAC receiver */ | 2141 | tc_writel(RX_CTL_CMD, &tr->Rx_Ctl); /* start MAC receiver */ |
2413 | 2142 | ||
2414 | /* start MAC transmitter */ | 2143 | /* start MAC transmitter */ |
2415 | #ifndef NO_CHECK_CARRIER | ||
2416 | /* TX4939 does not have EnLCarr */ | 2144 | /* TX4939 does not have EnLCarr */ |
2417 | if (lp->chiptype == TC35815_TX4939) | 2145 | if (lp->chiptype == TC35815_TX4939) |
2418 | txctl &= ~Tx_EnLCarr; | 2146 | txctl &= ~Tx_EnLCarr; |
2419 | #ifdef WORKAROUND_LOSTCAR | ||
2420 | /* WORKAROUND: ignore LostCrS in full duplex operation */ | 2147 | /* WORKAROUND: ignore LostCrS in full duplex operation */ |
2421 | if (!lp->phy_dev || !lp->link || lp->duplex == DUPLEX_FULL) | 2148 | if (!lp->phy_dev || !lp->link || lp->duplex == DUPLEX_FULL) |
2422 | txctl &= ~Tx_EnLCarr; | 2149 | 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); | 2150 | tc_writel(txctl, &tr->Tx_Ctl); |
2429 | } | 2151 | } |
2430 | 2152 | ||