@@ -674,40 +674,78 @@ static void bcmasp_adj_link(struct net_device *dev)
674
674
phy_print_status (phydev );
675
675
}
676
676
677
- static int bcmasp_init_rx (struct bcmasp_intf * intf )
677
+ static int bcmasp_alloc_buffers (struct bcmasp_intf * intf )
678
678
{
679
679
struct device * kdev = & intf -> parent -> pdev -> dev ;
680
680
struct page * buffer_pg ;
681
- dma_addr_t dma ;
682
- void * p ;
683
- u32 reg ;
684
- int ret ;
685
681
682
+ /* Alloc RX */
686
683
intf -> rx_buf_order = get_order (RING_BUFFER_SIZE );
687
684
buffer_pg = alloc_pages (GFP_KERNEL , intf -> rx_buf_order );
688
685
if (!buffer_pg )
689
686
return - ENOMEM ;
690
687
691
- dma = dma_map_page (kdev , buffer_pg , 0 , RING_BUFFER_SIZE ,
692
- DMA_FROM_DEVICE );
693
- if (dma_mapping_error (kdev , dma )) {
694
- __free_pages (buffer_pg , intf -> rx_buf_order );
695
- return - ENOMEM ;
696
- }
697
688
intf -> rx_ring_cpu = page_to_virt (buffer_pg );
698
- intf -> rx_ring_dma = dma ;
699
- intf -> rx_ring_dma_valid = intf -> rx_ring_dma + RING_BUFFER_SIZE - 1 ;
689
+ intf -> rx_ring_dma = dma_map_page (kdev , buffer_pg , 0 , RING_BUFFER_SIZE ,
690
+ DMA_FROM_DEVICE );
691
+ if (dma_mapping_error (kdev , intf -> rx_ring_dma ))
692
+ goto free_rx_buffer ;
693
+
694
+ intf -> rx_edpkt_cpu = dma_alloc_coherent (kdev , DESC_RING_SIZE ,
695
+ & intf -> rx_edpkt_dma_addr , GFP_KERNEL );
696
+ if (!intf -> rx_edpkt_cpu )
697
+ goto free_rx_buffer_dma ;
698
+
699
+ /* Alloc TX */
700
+ intf -> tx_spb_cpu = dma_alloc_coherent (kdev , DESC_RING_SIZE ,
701
+ & intf -> tx_spb_dma_addr , GFP_KERNEL );
702
+ if (!intf -> tx_spb_cpu )
703
+ goto free_rx_edpkt_dma ;
700
704
701
- p = dma_alloc_coherent ( kdev , DESC_RING_SIZE , & intf -> rx_edpkt_dma_addr ,
705
+ intf -> tx_cbs = kcalloc ( DESC_RING_COUNT , sizeof ( struct bcmasp_tx_cb ) ,
702
706
GFP_KERNEL );
703
- if (!p ) {
704
- ret = - ENOMEM ;
705
- goto free_rx_ring ;
706
- }
707
- intf -> rx_edpkt_cpu = p ;
707
+ if (!intf -> tx_cbs )
708
+ goto free_tx_spb_dma ;
708
709
709
- netif_napi_add (intf -> ndev , & intf -> rx_napi , bcmasp_rx_poll );
710
+ return 0 ;
711
+
712
+ free_tx_spb_dma :
713
+ dma_free_coherent (kdev , DESC_RING_SIZE , intf -> tx_spb_cpu ,
714
+ intf -> tx_spb_dma_addr );
715
+ free_rx_edpkt_dma :
716
+ dma_free_coherent (kdev , DESC_RING_SIZE , intf -> rx_edpkt_cpu ,
717
+ intf -> rx_edpkt_dma_addr );
718
+ free_rx_buffer_dma :
719
+ dma_unmap_page (kdev , intf -> rx_ring_dma , RING_BUFFER_SIZE ,
720
+ DMA_FROM_DEVICE );
721
+ free_rx_buffer :
722
+ __free_pages (buffer_pg , intf -> rx_buf_order );
723
+
724
+ return - ENOMEM ;
725
+ }
726
+
727
+ static void bcmasp_reclaim_free_buffers (struct bcmasp_intf * intf )
728
+ {
729
+ struct device * kdev = & intf -> parent -> pdev -> dev ;
730
+
731
+ /* RX buffers */
732
+ dma_free_coherent (kdev , DESC_RING_SIZE , intf -> rx_edpkt_cpu ,
733
+ intf -> rx_edpkt_dma_addr );
734
+ dma_unmap_page (kdev , intf -> rx_ring_dma , RING_BUFFER_SIZE ,
735
+ DMA_FROM_DEVICE );
736
+ __free_pages (virt_to_page (intf -> rx_ring_cpu ), intf -> rx_buf_order );
737
+
738
+ /* TX buffers */
739
+ dma_free_coherent (kdev , DESC_RING_SIZE , intf -> tx_spb_cpu ,
740
+ intf -> tx_spb_dma_addr );
741
+ kfree (intf -> tx_cbs );
742
+ }
710
743
744
+ static void bcmasp_init_rx (struct bcmasp_intf * intf )
745
+ {
746
+ /* Restart from index 0 */
747
+ intf -> rx_ring_dma_valid = intf -> rx_ring_dma + RING_BUFFER_SIZE - 1 ;
748
+ intf -> rx_edpkt_dma_valid = intf -> rx_edpkt_dma_addr + (DESC_RING_SIZE - 1 );
711
749
intf -> rx_edpkt_dma_read = intf -> rx_edpkt_dma_addr ;
712
750
intf -> rx_edpkt_index = 0 ;
713
751
@@ -733,64 +771,23 @@ static int bcmasp_init_rx(struct bcmasp_intf *intf)
733
771
rx_edpkt_dma_wq (intf , intf -> rx_edpkt_dma_addr , RX_EDPKT_DMA_WRITE );
734
772
rx_edpkt_dma_wq (intf , intf -> rx_edpkt_dma_addr , RX_EDPKT_DMA_READ );
735
773
rx_edpkt_dma_wq (intf , intf -> rx_edpkt_dma_addr , RX_EDPKT_DMA_BASE );
736
- rx_edpkt_dma_wq (intf , intf -> rx_edpkt_dma_addr + (DESC_RING_SIZE - 1 ),
737
- RX_EDPKT_DMA_END );
738
- rx_edpkt_dma_wq (intf , intf -> rx_edpkt_dma_addr + (DESC_RING_SIZE - 1 ),
739
- RX_EDPKT_DMA_VALID );
740
-
741
- reg = UMAC2FB_CFG_DEFAULT_EN |
742
- ((intf -> channel + 11 ) << UMAC2FB_CFG_CHID_SHIFT );
743
- reg |= (0xd << UMAC2FB_CFG_OK_SEND_SHIFT );
744
- umac2fb_wl (intf , reg , UMAC2FB_CFG );
774
+ rx_edpkt_dma_wq (intf , intf -> rx_edpkt_dma_valid , RX_EDPKT_DMA_END );
775
+ rx_edpkt_dma_wq (intf , intf -> rx_edpkt_dma_valid , RX_EDPKT_DMA_VALID );
745
776
746
- return 0 ;
747
-
748
- free_rx_ring :
749
- dma_unmap_page (kdev , intf -> rx_ring_dma , RING_BUFFER_SIZE ,
750
- DMA_FROM_DEVICE );
751
- __free_pages (virt_to_page (intf -> rx_ring_cpu ), intf -> rx_buf_order );
752
-
753
- return ret ;
777
+ umac2fb_wl (intf , UMAC2FB_CFG_DEFAULT_EN | ((intf -> channel + 11 ) <<
778
+ UMAC2FB_CFG_CHID_SHIFT ) | (0xd << UMAC2FB_CFG_OK_SEND_SHIFT ),
779
+ UMAC2FB_CFG );
754
780
}
755
781
756
- static void bcmasp_reclaim_free_all_rx (struct bcmasp_intf * intf )
757
- {
758
- struct device * kdev = & intf -> parent -> pdev -> dev ;
759
782
760
- dma_free_coherent (kdev , DESC_RING_SIZE , intf -> rx_edpkt_cpu ,
761
- intf -> rx_edpkt_dma_addr );
762
- dma_unmap_page (kdev , intf -> rx_ring_dma , RING_BUFFER_SIZE ,
763
- DMA_FROM_DEVICE );
764
- __free_pages (virt_to_page (intf -> rx_ring_cpu ), intf -> rx_buf_order );
765
- }
766
-
767
- static int bcmasp_init_tx (struct bcmasp_intf * intf )
783
+ static void bcmasp_init_tx (struct bcmasp_intf * intf )
768
784
{
769
- struct device * kdev = & intf -> parent -> pdev -> dev ;
770
- void * p ;
771
- int ret ;
772
-
773
- p = dma_alloc_coherent (kdev , DESC_RING_SIZE , & intf -> tx_spb_dma_addr ,
774
- GFP_KERNEL );
775
- if (!p )
776
- return - ENOMEM ;
777
-
778
- intf -> tx_spb_cpu = p ;
785
+ /* Restart from index 0 */
779
786
intf -> tx_spb_dma_valid = intf -> tx_spb_dma_addr + DESC_RING_SIZE - 1 ;
780
787
intf -> tx_spb_dma_read = intf -> tx_spb_dma_addr ;
781
-
782
- intf -> tx_cbs = kcalloc (DESC_RING_COUNT , sizeof (struct bcmasp_tx_cb ),
783
- GFP_KERNEL );
784
- if (!intf -> tx_cbs ) {
785
- ret = - ENOMEM ;
786
- goto free_tx_spb ;
787
- }
788
-
789
788
intf -> tx_spb_index = 0 ;
790
789
intf -> tx_spb_clean_index = 0 ;
791
790
792
- netif_napi_add_tx (intf -> ndev , & intf -> tx_napi , bcmasp_tx_poll );
793
-
794
791
/* Make sure channels are disabled */
795
792
tx_spb_ctrl_wl (intf , 0x0 , TX_SPB_CTRL_ENABLE );
796
793
tx_epkt_core_wl (intf , 0x0 , TX_EPKT_C_CFG_MISC );
@@ -806,26 +803,6 @@ static int bcmasp_init_tx(struct bcmasp_intf *intf)
806
803
tx_spb_dma_wq (intf , intf -> tx_spb_dma_addr , TX_SPB_DMA_BASE );
807
804
tx_spb_dma_wq (intf , intf -> tx_spb_dma_valid , TX_SPB_DMA_END );
808
805
tx_spb_dma_wq (intf , intf -> tx_spb_dma_valid , TX_SPB_DMA_VALID );
809
-
810
- return 0 ;
811
-
812
- free_tx_spb :
813
- dma_free_coherent (kdev , DESC_RING_SIZE , intf -> tx_spb_cpu ,
814
- intf -> tx_spb_dma_addr );
815
-
816
- return ret ;
817
- }
818
-
819
- static void bcmasp_reclaim_free_all_tx (struct bcmasp_intf * intf )
820
- {
821
- struct device * kdev = & intf -> parent -> pdev -> dev ;
822
-
823
- /* Free descriptors */
824
- dma_free_coherent (kdev , DESC_RING_SIZE , intf -> tx_spb_cpu ,
825
- intf -> tx_spb_dma_addr );
826
-
827
- /* Free cbs */
828
- kfree (intf -> tx_cbs );
829
806
}
830
807
831
808
static void bcmasp_ephy_enable_set (struct bcmasp_intf * intf , bool enable )
@@ -915,10 +892,7 @@ static void bcmasp_netif_deinit(struct net_device *dev)
915
892
bcmasp_enable_rx_irq (intf , 0 );
916
893
917
894
netif_napi_del (& intf -> tx_napi );
918
- bcmasp_reclaim_free_all_tx (intf );
919
-
920
895
netif_napi_del (& intf -> rx_napi );
921
- bcmasp_reclaim_free_all_rx (intf );
922
896
}
923
897
924
898
static int bcmasp_stop (struct net_device * dev )
@@ -932,6 +906,8 @@ static int bcmasp_stop(struct net_device *dev)
932
906
933
907
bcmasp_netif_deinit (dev );
934
908
909
+ bcmasp_reclaim_free_buffers (intf );
910
+
935
911
phy_disconnect (dev -> phydev );
936
912
937
913
/* Disable internal EPHY or external PHY */
@@ -1073,17 +1049,12 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect)
1073
1049
intf -> old_link = -1 ;
1074
1050
intf -> old_pause = -1 ;
1075
1051
1076
- ret = bcmasp_init_tx (intf );
1077
- if (ret )
1078
- goto err_phy_disconnect ;
1079
-
1080
- /* Turn on asp */
1052
+ bcmasp_init_tx (intf );
1053
+ netif_napi_add_tx (intf -> ndev , & intf -> tx_napi , bcmasp_tx_poll );
1081
1054
bcmasp_enable_tx (intf , 1 );
1082
1055
1083
- ret = bcmasp_init_rx (intf );
1084
- if (ret )
1085
- goto err_reclaim_tx ;
1086
-
1056
+ bcmasp_init_rx (intf );
1057
+ netif_napi_add (intf -> ndev , & intf -> rx_napi , bcmasp_rx_poll );
1087
1058
bcmasp_enable_rx (intf , 1 );
1088
1059
1089
1060
/* Turn on UniMAC TX/RX */
@@ -1097,12 +1068,6 @@ static int bcmasp_netif_init(struct net_device *dev, bool phy_connect)
1097
1068
1098
1069
return 0 ;
1099
1070
1100
- err_reclaim_tx :
1101
- netif_napi_del (& intf -> tx_napi );
1102
- bcmasp_reclaim_free_all_tx (intf );
1103
- err_phy_disconnect :
1104
- if (phydev )
1105
- phy_disconnect (phydev );
1106
1071
err_phy_disable :
1107
1072
if (intf -> internal_phy )
1108
1073
bcmasp_ephy_enable_set (intf , false);
@@ -1118,13 +1083,24 @@ static int bcmasp_open(struct net_device *dev)
1118
1083
1119
1084
netif_dbg (intf , ifup , dev , "bcmasp open\n" );
1120
1085
1121
- ret = clk_prepare_enable (intf -> parent -> clk );
1086
+ ret = bcmasp_alloc_buffers (intf );
1122
1087
if (ret )
1123
1088
return ret ;
1124
1089
1125
- ret = bcmasp_netif_init ( dev , true );
1090
+ ret = clk_prepare_enable ( intf -> parent -> clk );
1126
1091
if (ret )
1092
+ goto err_free_mem ;
1093
+
1094
+ ret = bcmasp_netif_init (dev , true);
1095
+ if (ret ) {
1127
1096
clk_disable_unprepare (intf -> parent -> clk );
1097
+ goto err_free_mem ;
1098
+ }
1099
+
1100
+ return ret ;
1101
+
1102
+ err_free_mem :
1103
+ bcmasp_reclaim_free_buffers (intf );
1128
1104
1129
1105
return ret ;
1130
1106
}
0 commit comments