aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tc35815.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/tc35815.c')
-rw-r--r--drivers/net/tc35815.c320
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
30static const char *version = "tc35815.c:v" DRV_VERSION "\n"; 26static 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
64enum tc35815_chiptype { 53enum 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
79static const struct pci_device_id tc35815_pci_tbl[] = { 68static 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
490static 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
503static 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
524static 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 */
534static struct sk_buff *alloc_rxbuf_skb(struct net_device *dev, 450static 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
562static int tc35815_open(struct net_device *dev); 477static int tc35815_open(struct net_device *dev);
563static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev); 478static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev);
564static irqreturn_t tc35815_interrupt(int irq, void *dev_id); 479static irqreturn_t tc35815_interrupt(int irq, void *dev_id);
565#ifdef TC35815_NAPI
566static int tc35815_rx(struct net_device *dev, int limit); 480static int tc35815_rx(struct net_device *dev, int limit);
567static int tc35815_poll(struct napi_struct *napi, int budget); 481static int tc35815_poll(struct napi_struct *napi, int budget);
568#else
569static void tc35815_rx(struct net_device *dev);
570#endif
571static void tc35815_txdone(struct net_device *dev); 482static void tc35815_txdone(struct net_device *dev);
572static int tc35815_close(struct net_device *dev); 483static int tc35815_close(struct net_device *dev);
573static struct net_device_stats *tc35815_get_stats(struct net_device *dev); 484static 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
1258static void 1121static void
1259dump_frfd(struct FrFD *fd) 1122dump_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
1277static void 1138static void
1278panic_queues(struct net_device *dev) 1139panic_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
1362static void tc35815_tx_timeout(struct net_device *dev) 1228static 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
1540static int tc35815_do_interrupt(struct net_device *dev, u32 status, int limit) 1401static int tc35815_do_interrupt(struct net_device *dev, u32 status, int limit)
1541#else
1542static 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
1656static int 1493static int
1657tc35815_rx(struct net_device *dev, int limit) 1494tc35815_rx(struct net_device *dev, int limit)
1658#else
1659static void
1660tc35815_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
1891static int tc35815_poll(struct napi_struct *napi, int budget) 1652static 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
1935static void 1691static void
1936tc35815_check_tx_stat(struct net_device *dev, int status) 1692tc35815_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