@@ -75,6 +75,7 @@ struct sgiseeq_init_block { /* Note the name ;-) */
75
75
76
76
struct sgiseeq_private {
77
77
struct sgiseeq_init_block * srings ;
78
+ dma_addr_t srings_dma ;
78
79
79
80
/* Ptrs to the descriptors in uncached space. */
80
81
struct sgiseeq_rx_desc * rx_desc ;
@@ -643,13 +644,20 @@ static int __init sgiseeq_probe(struct platform_device *pdev)
643
644
sp = netdev_priv (dev );
644
645
645
646
/* Make private data page aligned */
646
- sr = (struct sgiseeq_init_block * ) get_zeroed_page (GFP_KERNEL );
647
+ sr = dma_alloc_coherent (& pdev -> dev , sizeof (* sp -> srings ),
648
+ & sp -> srings_dma , GFP_KERNEL );
647
649
if (!sr ) {
648
650
printk (KERN_ERR "Sgiseeq: Page alloc failed, aborting.\n" );
649
651
err = - ENOMEM ;
650
652
goto err_out_free_dev ;
651
653
}
652
654
sp -> srings = sr ;
655
+ sp -> rx_desc = sp -> srings -> rxvector ;
656
+ sp -> tx_desc = sp -> srings -> txvector ;
657
+
658
+ /* A couple calculations now, saves many cycles later. */
659
+ setup_rx_ring (sp -> rx_desc , SEEQ_RX_BUFFERS );
660
+ setup_tx_ring (sp -> tx_desc , SEEQ_TX_BUFFERS );
653
661
654
662
memcpy (dev -> dev_addr , pd -> mac , ETH_ALEN );
655
663
@@ -662,19 +670,6 @@ static int __init sgiseeq_probe(struct platform_device *pdev)
662
670
sp -> name = sgiseeqstr ;
663
671
sp -> mode = SEEQ_RCMD_RBCAST ;
664
672
665
- sp -> rx_desc = (struct sgiseeq_rx_desc * )
666
- CKSEG1ADDR (ALIGNED (& sp -> srings -> rxvector [0 ]));
667
- dma_cache_wback_inv ((unsigned long )& sp -> srings -> rxvector ,
668
- sizeof (sp -> srings -> rxvector ));
669
- sp -> tx_desc = (struct sgiseeq_tx_desc * )
670
- CKSEG1ADDR (ALIGNED (& sp -> srings -> txvector [0 ]));
671
- dma_cache_wback_inv ((unsigned long )& sp -> srings -> txvector ,
672
- sizeof (sp -> srings -> txvector ));
673
-
674
- /* A couple calculations now, saves many cycles later. */
675
- setup_rx_ring (sp -> rx_desc , SEEQ_RX_BUFFERS );
676
- setup_tx_ring (sp -> tx_desc , SEEQ_TX_BUFFERS );
677
-
678
673
/* Setup PIO and DMA transfer timing */
679
674
sp -> hregs -> pconfig = 0x161 ;
680
675
sp -> hregs -> dconfig = HPC3_EDCFG_FIRQ | HPC3_EDCFG_FEOP |
@@ -732,7 +727,8 @@ static int __exit sgiseeq_remove(struct platform_device *pdev)
732
727
struct sgiseeq_private * sp = netdev_priv (dev );
733
728
734
729
unregister_netdev (dev );
735
- free_page ((unsigned long ) sp -> srings );
730
+ dma_free_coherent (& pdev -> dev , sizeof (* sp -> srings ), sp -> srings ,
731
+ sp -> srings_dma );
736
732
free_netdev (dev );
737
733
platform_set_drvdata (pdev , NULL );
738
734
0 commit comments