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.c292
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
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,
@@ -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
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, 449static 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
562static int tc35815_open(struct net_device *dev); 476static int tc35815_open(struct net_device *dev);
563static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev); 477static int tc35815_send_packet(struct sk_buff *skb, struct net_device *dev);
564static irqreturn_t tc35815_interrupt(int irq, void *dev_id); 478static irqreturn_t tc35815_interrupt(int irq, void *dev_id);
565#ifdef TC35815_NAPI
566static int tc35815_rx(struct net_device *dev, int limit); 479static int tc35815_rx(struct net_device *dev, int limit);
567static int tc35815_poll(struct napi_struct *napi, int budget); 480static 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); 481static void tc35815_txdone(struct net_device *dev);
572static int tc35815_close(struct net_device *dev); 482static int tc35815_close(struct net_device *dev);
573static struct net_device_stats *tc35815_get_stats(struct net_device *dev); 483static 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
1258static void 1119static void
1259dump_frfd(struct FrFD *fd) 1120dump_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
1277static void 1136static void
1278panic_queues(struct net_device *dev) 1137panic_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
1540static int tc35815_do_interrupt(struct net_device *dev, u32 status, int limit) 1394static 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{ 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
1656static int 1485static int
1657tc35815_rx(struct net_device *dev, int limit) 1486tc35815_rx(struct net_device *dev, int limit)
1658#else
1659static void
1660tc35815_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
1891static int tc35815_poll(struct napi_struct *napi, int budget) 1644static 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
1935static void 1683static void
1936tc35815_check_tx_stat(struct net_device *dev, int status) 1684tc35815_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