forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/drivers/net/ethernet/i825xx/lib82596.c
....@@ -351,7 +351,7 @@
351351 static irqreturn_t i596_interrupt(int irq, void *dev_id);
352352 static int i596_close(struct net_device *dev);
353353 static void i596_add_cmd(struct net_device *dev, struct i596_cmd *cmd);
354
-static void i596_tx_timeout (struct net_device *dev);
354
+static void i596_tx_timeout (struct net_device *dev, unsigned int txqueue);
355355 static void print_eth(unsigned char *buf, char *str);
356356 static void set_multicast_list(struct net_device *dev);
357357 static inline void ca(struct net_device *dev);
....@@ -365,13 +365,44 @@
365365 static void i596_poll_controller(struct net_device *dev);
366366 #endif
367367
368
+static inline dma_addr_t virt_to_dma(struct i596_private *lp, volatile void *v)
369
+{
370
+ return lp->dma_addr + ((unsigned long)v - (unsigned long)lp->dma);
371
+}
372
+
373
+#ifdef NONCOHERENT_DMA
374
+static inline void dma_sync_dev(struct net_device *ndev, volatile void *addr,
375
+ size_t len)
376
+{
377
+ dma_sync_single_for_device(ndev->dev.parent,
378
+ virt_to_dma(netdev_priv(ndev), addr), len,
379
+ DMA_BIDIRECTIONAL);
380
+}
381
+
382
+static inline void dma_sync_cpu(struct net_device *ndev, volatile void *addr,
383
+ size_t len)
384
+{
385
+ dma_sync_single_for_cpu(ndev->dev.parent,
386
+ virt_to_dma(netdev_priv(ndev), addr), len,
387
+ DMA_BIDIRECTIONAL);
388
+}
389
+#else
390
+static inline void dma_sync_dev(struct net_device *ndev, volatile void *addr,
391
+ size_t len)
392
+{
393
+}
394
+static inline void dma_sync_cpu(struct net_device *ndev, volatile void *addr,
395
+ size_t len)
396
+{
397
+}
398
+#endif /* NONCOHERENT_DMA */
368399
369400 static inline int wait_istat(struct net_device *dev, struct i596_dma *dma, int delcnt, char *str)
370401 {
371
- DMA_INV(dev, &(dma->iscp), sizeof(struct i596_iscp));
402
+ dma_sync_cpu(dev, &(dma->iscp), sizeof(struct i596_iscp));
372403 while (--delcnt && dma->iscp.stat) {
373404 udelay(10);
374
- DMA_INV(dev, &(dma->iscp), sizeof(struct i596_iscp));
405
+ dma_sync_cpu(dev, &(dma->iscp), sizeof(struct i596_iscp));
375406 }
376407 if (!delcnt) {
377408 printk(KERN_ERR "%s: %s, iscp.stat %04x, didn't clear\n",
....@@ -384,10 +415,10 @@
384415
385416 static inline int wait_cmd(struct net_device *dev, struct i596_dma *dma, int delcnt, char *str)
386417 {
387
- DMA_INV(dev, &(dma->scb), sizeof(struct i596_scb));
418
+ dma_sync_cpu(dev, &(dma->scb), sizeof(struct i596_scb));
388419 while (--delcnt && dma->scb.command) {
389420 udelay(10);
390
- DMA_INV(dev, &(dma->scb), sizeof(struct i596_scb));
421
+ dma_sync_cpu(dev, &(dma->scb), sizeof(struct i596_scb));
391422 }
392423 if (!delcnt) {
393424 printk(KERN_ERR "%s: %s, status %4.4x, cmd %4.4x.\n",
....@@ -451,11 +482,8 @@
451482 SWAP32(rbd->b_data), SWAP16(rbd->size));
452483 rbd = rbd->v_next;
453484 } while (rbd != lp->rbd_head);
454
- DMA_INV(dev, dma, sizeof(struct i596_dma));
485
+ dma_sync_cpu(dev, dma, sizeof(struct i596_dma));
455486 }
456
-
457
-
458
-#define virt_to_dma(lp, v) ((lp)->dma_addr + (dma_addr_t)((unsigned long)(v)-(unsigned long)((lp)->dma)))
459487
460488 static inline int init_rx_bufs(struct net_device *dev)
461489 {
....@@ -508,7 +536,7 @@
508536 rfd->b_next = SWAP32(virt_to_dma(lp, dma->rfds));
509537 rfd->cmd = SWAP16(CMD_EOL|CMD_FLEX);
510538
511
- DMA_WBACK_INV(dev, dma, sizeof(struct i596_dma));
539
+ dma_sync_dev(dev, dma, sizeof(struct i596_dma));
512540 return 0;
513541 }
514542
....@@ -547,7 +575,7 @@
547575 lp->rbd_head = dma->rbds;
548576 dma->rfds[0].rbd = SWAP32(virt_to_dma(lp, dma->rbds));
549577
550
- DMA_WBACK_INV(dev, dma, sizeof(struct i596_dma));
578
+ dma_sync_dev(dev, dma, sizeof(struct i596_dma));
551579 }
552580
553581
....@@ -575,9 +603,9 @@
575603
576604 DEB(DEB_INIT, printk(KERN_DEBUG "%s: starting i82596.\n", dev->name));
577605
578
- DMA_WBACK(dev, &(dma->scp), sizeof(struct i596_scp));
579
- DMA_WBACK(dev, &(dma->iscp), sizeof(struct i596_iscp));
580
- DMA_WBACK(dev, &(dma->scb), sizeof(struct i596_scb));
606
+ dma_sync_dev(dev, &(dma->scp), sizeof(struct i596_scp));
607
+ dma_sync_dev(dev, &(dma->iscp), sizeof(struct i596_iscp));
608
+ dma_sync_dev(dev, &(dma->scb), sizeof(struct i596_scb));
581609
582610 mpu_port(dev, PORT_ALTSCP, virt_to_dma(lp, &dma->scp));
583611 ca(dev);
....@@ -596,24 +624,24 @@
596624 rebuild_rx_bufs(dev);
597625
598626 dma->scb.command = 0;
599
- DMA_WBACK(dev, &(dma->scb), sizeof(struct i596_scb));
627
+ dma_sync_dev(dev, &(dma->scb), sizeof(struct i596_scb));
600628
601629 DEB(DEB_INIT, printk(KERN_DEBUG
602630 "%s: queuing CmdConfigure\n", dev->name));
603631 memcpy(dma->cf_cmd.i596_config, init_setup, 14);
604632 dma->cf_cmd.cmd.command = SWAP16(CmdConfigure);
605
- DMA_WBACK(dev, &(dma->cf_cmd), sizeof(struct cf_cmd));
633
+ dma_sync_dev(dev, &(dma->cf_cmd), sizeof(struct cf_cmd));
606634 i596_add_cmd(dev, &dma->cf_cmd.cmd);
607635
608636 DEB(DEB_INIT, printk(KERN_DEBUG "%s: queuing CmdSASetup\n", dev->name));
609637 memcpy(dma->sa_cmd.eth_addr, dev->dev_addr, ETH_ALEN);
610638 dma->sa_cmd.cmd.command = SWAP16(CmdSASetup);
611
- DMA_WBACK(dev, &(dma->sa_cmd), sizeof(struct sa_cmd));
639
+ dma_sync_dev(dev, &(dma->sa_cmd), sizeof(struct sa_cmd));
612640 i596_add_cmd(dev, &dma->sa_cmd.cmd);
613641
614642 DEB(DEB_INIT, printk(KERN_DEBUG "%s: queuing CmdTDR\n", dev->name));
615643 dma->tdr_cmd.cmd.command = SWAP16(CmdTDR);
616
- DMA_WBACK(dev, &(dma->tdr_cmd), sizeof(struct tdr_cmd));
644
+ dma_sync_dev(dev, &(dma->tdr_cmd), sizeof(struct tdr_cmd));
617645 i596_add_cmd(dev, &dma->tdr_cmd.cmd);
618646
619647 spin_lock_irqsave (&lp->lock, flags);
....@@ -625,7 +653,7 @@
625653 DEB(DEB_INIT, printk(KERN_DEBUG "%s: Issuing RX_START\n", dev->name));
626654 dma->scb.command = SWAP16(RX_START);
627655 dma->scb.rfd = SWAP32(virt_to_dma(lp, dma->rfds));
628
- DMA_WBACK(dev, &(dma->scb), sizeof(struct i596_scb));
656
+ dma_sync_dev(dev, &(dma->scb), sizeof(struct i596_scb));
629657
630658 ca(dev);
631659
....@@ -659,13 +687,13 @@
659687
660688 rfd = lp->rfd_head; /* Ref next frame to check */
661689
662
- DMA_INV(dev, rfd, sizeof(struct i596_rfd));
690
+ dma_sync_cpu(dev, rfd, sizeof(struct i596_rfd));
663691 while (rfd->stat & SWAP16(STAT_C)) { /* Loop while complete frames */
664692 if (rfd->rbd == I596_NULL)
665693 rbd = NULL;
666694 else if (rfd->rbd == lp->rbd_head->b_addr) {
667695 rbd = lp->rbd_head;
668
- DMA_INV(dev, rbd, sizeof(struct i596_rbd));
696
+ dma_sync_cpu(dev, rbd, sizeof(struct i596_rbd));
669697 } else {
670698 printk(KERN_ERR "%s: rbd chain broken!\n", dev->name);
671699 /* XXX Now what? */
....@@ -713,7 +741,7 @@
713741 DMA_FROM_DEVICE);
714742 rbd->v_data = newskb->data;
715743 rbd->b_data = SWAP32(dma_addr);
716
- DMA_WBACK_INV(dev, rbd, sizeof(struct i596_rbd));
744
+ dma_sync_dev(dev, rbd, sizeof(struct i596_rbd));
717745 } else {
718746 skb = netdev_alloc_skb_ip_align(dev, pkt_len);
719747 }
....@@ -765,7 +793,7 @@
765793 if (rbd != NULL && (rbd->count & SWAP16(0x4000))) {
766794 rbd->count = 0;
767795 lp->rbd_head = rbd->v_next;
768
- DMA_WBACK_INV(dev, rbd, sizeof(struct i596_rbd));
796
+ dma_sync_dev(dev, rbd, sizeof(struct i596_rbd));
769797 }
770798
771799 /* Tidy the frame descriptor, marking it as end of list */
....@@ -779,14 +807,14 @@
779807
780808 lp->dma->scb.rfd = rfd->b_next;
781809 lp->rfd_head = rfd->v_next;
782
- DMA_WBACK_INV(dev, rfd, sizeof(struct i596_rfd));
810
+ dma_sync_dev(dev, rfd, sizeof(struct i596_rfd));
783811
784812 /* Remove end-of-list from old end descriptor */
785813
786814 rfd->v_prev->cmd = SWAP16(CMD_FLEX);
787
- DMA_WBACK_INV(dev, rfd->v_prev, sizeof(struct i596_rfd));
815
+ dma_sync_dev(dev, rfd->v_prev, sizeof(struct i596_rfd));
788816 rfd = lp->rfd_head;
789
- DMA_INV(dev, rfd, sizeof(struct i596_rfd));
817
+ dma_sync_cpu(dev, rfd, sizeof(struct i596_rfd));
790818 }
791819
792820 DEB(DEB_RXFRAME, printk(KERN_DEBUG "frames %d\n", frames));
....@@ -827,12 +855,12 @@
827855 ptr->v_next = NULL;
828856 ptr->b_next = I596_NULL;
829857 }
830
- DMA_WBACK_INV(dev, ptr, sizeof(struct i596_cmd));
858
+ dma_sync_dev(dev, ptr, sizeof(struct i596_cmd));
831859 }
832860
833861 wait_cmd(dev, lp->dma, 100, "i596_cleanup_cmd timed out");
834862 lp->dma->scb.cmd = I596_NULL;
835
- DMA_WBACK(dev, &(lp->dma->scb), sizeof(struct i596_scb));
863
+ dma_sync_dev(dev, &(lp->dma->scb), sizeof(struct i596_scb));
836864 }
837865
838866
....@@ -850,7 +878,7 @@
850878
851879 /* FIXME: this command might cause an lpmc */
852880 lp->dma->scb.command = SWAP16(CUC_ABORT | RX_ABORT);
853
- DMA_WBACK(dev, &(lp->dma->scb), sizeof(struct i596_scb));
881
+ dma_sync_dev(dev, &(lp->dma->scb), sizeof(struct i596_scb));
854882 ca(dev);
855883
856884 /* wait for shutdown */
....@@ -878,20 +906,20 @@
878906 cmd->command |= SWAP16(CMD_EOL | CMD_INTR);
879907 cmd->v_next = NULL;
880908 cmd->b_next = I596_NULL;
881
- DMA_WBACK(dev, cmd, sizeof(struct i596_cmd));
909
+ dma_sync_dev(dev, cmd, sizeof(struct i596_cmd));
882910
883911 spin_lock_irqsave (&lp->lock, flags);
884912
885913 if (lp->cmd_head != NULL) {
886914 lp->cmd_tail->v_next = cmd;
887915 lp->cmd_tail->b_next = SWAP32(virt_to_dma(lp, &cmd->status));
888
- DMA_WBACK(dev, lp->cmd_tail, sizeof(struct i596_cmd));
916
+ dma_sync_dev(dev, lp->cmd_tail, sizeof(struct i596_cmd));
889917 } else {
890918 lp->cmd_head = cmd;
891919 wait_cmd(dev, dma, 100, "i596_add_cmd timed out");
892920 dma->scb.cmd = SWAP32(virt_to_dma(lp, &cmd->status));
893921 dma->scb.command = SWAP16(CUC_START);
894
- DMA_WBACK(dev, &(dma->scb), sizeof(struct i596_scb));
922
+ dma_sync_dev(dev, &(dma->scb), sizeof(struct i596_scb));
895923 ca(dev);
896924 }
897925 lp->cmd_tail = cmd;
....@@ -936,7 +964,7 @@
936964 return -EAGAIN;
937965 }
938966
939
-static void i596_tx_timeout (struct net_device *dev)
967
+static void i596_tx_timeout (struct net_device *dev, unsigned int txqueue)
940968 {
941969 struct i596_private *lp = netdev_priv(dev);
942970
....@@ -956,7 +984,7 @@
956984 /* Issue a channel attention signal */
957985 DEB(DEB_ERRORS, printk(KERN_DEBUG "Kicking board.\n"));
958986 lp->dma->scb.command = SWAP16(CUC_START | RX_START);
959
- DMA_WBACK_INV(dev, &(lp->dma->scb), sizeof(struct i596_scb));
987
+ dma_sync_dev(dev, &(lp->dma->scb), sizeof(struct i596_scb));
960988 ca (dev);
961989 lp->last_restart = dev->stats.tx_packets;
962990 }
....@@ -1014,8 +1042,8 @@
10141042 tbd->data = SWAP32(tx_cmd->dma_addr);
10151043
10161044 DEB(DEB_TXADDR, print_eth(skb->data, "tx-queued"));
1017
- DMA_WBACK_INV(dev, tx_cmd, sizeof(struct tx_cmd));
1018
- DMA_WBACK_INV(dev, tbd, sizeof(struct i596_tbd));
1045
+ dma_sync_dev(dev, tx_cmd, sizeof(struct tx_cmd));
1046
+ dma_sync_dev(dev, tbd, sizeof(struct i596_tbd));
10191047 i596_add_cmd(dev, &tx_cmd->cmd);
10201048
10211049 dev->stats.tx_packets++;
....@@ -1047,9 +1075,8 @@
10471075
10481076 static int i82596_probe(struct net_device *dev)
10491077 {
1050
- int i;
10511078 struct i596_private *lp = netdev_priv(dev);
1052
- struct i596_dma *dma;
1079
+ int ret;
10531080
10541081 /* This lot is ensure things have been cache line aligned. */
10551082 BUILD_BUG_ON(sizeof(struct i596_rfd) != 32);
....@@ -1063,41 +1090,28 @@
10631090 if (!dev->base_addr || !dev->irq)
10641091 return -ENODEV;
10651092
1066
- dma = dma_alloc_attrs(dev->dev.parent, sizeof(struct i596_dma),
1067
- &lp->dma_addr, GFP_KERNEL,
1068
- LIB82596_DMA_ATTR);
1069
- if (!dma) {
1070
- printk(KERN_ERR "%s: Couldn't get shared memory\n", __FILE__);
1071
- return -ENOMEM;
1072
- }
1073
-
10741093 dev->netdev_ops = &i596_netdev_ops;
10751094 dev->watchdog_timeo = TX_TIMEOUT;
10761095
1077
- memset(dma, 0, sizeof(struct i596_dma));
1078
- lp->dma = dma;
1079
-
1080
- dma->scb.command = 0;
1081
- dma->scb.cmd = I596_NULL;
1082
- dma->scb.rfd = I596_NULL;
1096
+ memset(lp->dma, 0, sizeof(struct i596_dma));
1097
+ lp->dma->scb.command = 0;
1098
+ lp->dma->scb.cmd = I596_NULL;
1099
+ lp->dma->scb.rfd = I596_NULL;
10831100 spin_lock_init(&lp->lock);
10841101
1085
- DMA_WBACK_INV(dev, dma, sizeof(struct i596_dma));
1102
+ dma_sync_dev(dev, lp->dma, sizeof(struct i596_dma));
10861103
1087
- i = register_netdev(dev);
1088
- if (i) {
1089
- dma_free_attrs(dev->dev.parent, sizeof(struct i596_dma),
1090
- dma, lp->dma_addr, LIB82596_DMA_ATTR);
1091
- return i;
1092
- }
1104
+ ret = register_netdev(dev);
1105
+ if (ret)
1106
+ return ret;
10931107
10941108 DEB(DEB_PROBE, printk(KERN_INFO "%s: 82596 at %#3lx, %pM IRQ %d.\n",
10951109 dev->name, dev->base_addr, dev->dev_addr,
10961110 dev->irq));
10971111 DEB(DEB_INIT, printk(KERN_INFO
10981112 "%s: dma at 0x%p (%d bytes), lp->scb at 0x%p\n",
1099
- dev->name, dma, (int)sizeof(struct i596_dma),
1100
- &dma->scb));
1113
+ dev->name, lp->dma, (int)sizeof(struct i596_dma),
1114
+ &lp->dma->scb));
11011115
11021116 return 0;
11031117 }
....@@ -1155,7 +1169,7 @@
11551169 dev->name, status & 0x0700));
11561170
11571171 while (lp->cmd_head != NULL) {
1158
- DMA_INV(dev, lp->cmd_head, sizeof(struct i596_cmd));
1172
+ dma_sync_cpu(dev, lp->cmd_head, sizeof(struct i596_cmd));
11591173 if (!(lp->cmd_head->status & SWAP16(STAT_C)))
11601174 break;
11611175
....@@ -1194,7 +1208,7 @@
11941208 dma_unmap_single(dev->dev.parent,
11951209 tx_cmd->dma_addr,
11961210 skb->len, DMA_TO_DEVICE);
1197
- dev_kfree_skb_irq(skb);
1211
+ dev_consume_skb_irq(skb);
11981212
11991213 tx_cmd->cmd.command = 0; /* Mark free */
12001214 break;
....@@ -1237,7 +1251,7 @@
12371251 }
12381252 ptr->v_next = NULL;
12391253 ptr->b_next = I596_NULL;
1240
- DMA_WBACK(dev, ptr, sizeof(struct i596_cmd));
1254
+ dma_sync_dev(dev, ptr, sizeof(struct i596_cmd));
12411255 lp->last_cmd = jiffies;
12421256 }
12431257
....@@ -1251,13 +1265,13 @@
12511265
12521266 ptr->command &= SWAP16(0x1fff);
12531267 ptr = ptr->v_next;
1254
- DMA_WBACK_INV(dev, prev, sizeof(struct i596_cmd));
1268
+ dma_sync_dev(dev, prev, sizeof(struct i596_cmd));
12551269 }
12561270
12571271 if (lp->cmd_head != NULL)
12581272 ack_cmd |= CUC_START;
12591273 dma->scb.cmd = SWAP32(virt_to_dma(lp, &lp->cmd_head->status));
1260
- DMA_WBACK_INV(dev, &dma->scb, sizeof(struct i596_scb));
1274
+ dma_sync_dev(dev, &dma->scb, sizeof(struct i596_scb));
12611275 }
12621276 if ((status & 0x1000) || (status & 0x4000)) {
12631277 if ((status & 0x4000))
....@@ -1282,7 +1296,7 @@
12821296 }
12831297 wait_cmd(dev, dma, 100, "i596 interrupt, timeout");
12841298 dma->scb.command = SWAP16(ack_cmd);
1285
- DMA_WBACK(dev, &dma->scb, sizeof(struct i596_scb));
1299
+ dma_sync_dev(dev, &dma->scb, sizeof(struct i596_scb));
12861300
12871301 /* DANGER: I suspect that some kind of interrupt
12881302 acknowledgement aside from acking the 82596 might be needed
....@@ -1313,7 +1327,7 @@
13131327
13141328 wait_cmd(dev, lp->dma, 100, "close1 timed out");
13151329 lp->dma->scb.command = SWAP16(CUC_ABORT | RX_ABORT);
1316
- DMA_WBACK(dev, &lp->dma->scb, sizeof(struct i596_scb));
1330
+ dma_sync_dev(dev, &lp->dma->scb, sizeof(struct i596_scb));
13171331
13181332 ca(dev);
13191333
....@@ -1372,7 +1386,7 @@
13721386 dev->name);
13731387 else {
13741388 dma->cf_cmd.cmd.command = SWAP16(CmdConfigure);
1375
- DMA_WBACK_INV(dev, &dma->cf_cmd, sizeof(struct cf_cmd));
1389
+ dma_sync_dev(dev, &dma->cf_cmd, sizeof(struct cf_cmd));
13761390 i596_add_cmd(dev, &dma->cf_cmd.cmd);
13771391 }
13781392 }
....@@ -1404,7 +1418,7 @@
14041418 dev->name, cp));
14051419 cp += ETH_ALEN;
14061420 }
1407
- DMA_WBACK_INV(dev, &dma->mc_cmd, sizeof(struct mc_cmd));
1421
+ dma_sync_dev(dev, &dma->mc_cmd, sizeof(struct mc_cmd));
14081422 i596_add_cmd(dev, &cmd->cmd);
14091423 }
14101424 }