@@ -109,7 +109,7 @@ static void bgmac_dma_tx_enable(struct bgmac *bgmac,
109
109
u32 ctl ;
110
110
111
111
ctl = bgmac_read (bgmac , ring -> mmio_base + BGMAC_DMA_TX_CTL );
112
- if (bgmac -> core -> id . rev >= 4 ) {
112
+ if (bgmac -> feature_flags & BGMAC_FEAT_TX_MASK_SETUP ) {
113
113
ctl &= ~BGMAC_DMA_TX_BL_MASK ;
114
114
ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT ;
115
115
@@ -331,7 +331,7 @@ static void bgmac_dma_rx_enable(struct bgmac *bgmac,
331
331
u32 ctl ;
332
332
333
333
ctl = bgmac_read (bgmac , ring -> mmio_base + BGMAC_DMA_RX_CTL );
334
- if (bgmac -> core -> id . rev >= 4 ) {
334
+ if (bgmac -> feature_flags & BGMAC_FEAT_RX_MASK_SETUP ) {
335
335
ctl &= ~BGMAC_DMA_RX_BL_MASK ;
336
336
ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT ;
337
337
@@ -769,14 +769,20 @@ static void bgmac_cmdcfg_maskset(struct bgmac *bgmac, u32 mask, u32 set,
769
769
{
770
770
u32 cmdcfg = bgmac_read (bgmac , BGMAC_CMDCFG );
771
771
u32 new_val = (cmdcfg & mask ) | set ;
772
+ u32 cmdcfg_sr ;
772
773
773
- bgmac_set (bgmac , BGMAC_CMDCFG , BGMAC_CMDCFG_SR (bgmac -> core -> id .rev ));
774
+ if (bgmac -> feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4 )
775
+ cmdcfg_sr = BGMAC_CMDCFG_SR_REV4 ;
776
+ else
777
+ cmdcfg_sr = BGMAC_CMDCFG_SR_REV0 ;
778
+
779
+ bgmac_set (bgmac , BGMAC_CMDCFG , cmdcfg_sr );
774
780
udelay (2 );
775
781
776
782
if (new_val != cmdcfg || force )
777
783
bgmac_write (bgmac , BGMAC_CMDCFG , new_val );
778
784
779
- bgmac_mask (bgmac , BGMAC_CMDCFG , ~BGMAC_CMDCFG_SR ( bgmac -> core -> id . rev ) );
785
+ bgmac_mask (bgmac , BGMAC_CMDCFG , ~cmdcfg_sr );
780
786
udelay (2 );
781
787
}
782
788
@@ -805,7 +811,7 @@ static void bgmac_chip_stats_update(struct bgmac *bgmac)
805
811
{
806
812
int i ;
807
813
808
- if (bgmac -> core -> id . id != BCMA_CORE_4706_MAC_GBIT ) {
814
+ if (!( bgmac -> feature_flags & BGMAC_FEAT_NO_CLR_MIB ) ) {
809
815
for (i = 0 ; i < BGMAC_NUM_MIB_TX_REGS ; i ++ )
810
816
bgmac -> mib_tx_regs [i ] =
811
817
bgmac_read (bgmac ,
@@ -824,7 +830,7 @@ static void bgmac_clear_mib(struct bgmac *bgmac)
824
830
{
825
831
int i ;
826
832
827
- if (bgmac -> core -> id . id == BCMA_CORE_4706_MAC_GBIT )
833
+ if (bgmac -> feature_flags & BGMAC_FEAT_NO_CLR_MIB )
828
834
return ;
829
835
830
836
bgmac_set (bgmac , BGMAC_DEV_CTL , BGMAC_DC_MROR );
@@ -867,16 +873,17 @@ static void bgmac_mac_speed(struct bgmac *bgmac)
867
873
static void bgmac_miiconfig (struct bgmac * bgmac )
868
874
{
869
875
struct bcma_device * core = bgmac -> core ;
870
- u8 imode ;
871
876
872
- if (bgmac_is_bcm4707_family ( bgmac ) ) {
877
+ if (bgmac -> feature_flags & BGMAC_FEAT_FORCE_SPEED_2500 ) {
873
878
bcma_awrite32 (core , BCMA_IOCTL ,
874
879
bcma_aread32 (core , BCMA_IOCTL ) | 0x40 |
875
880
BGMAC_BCMA_IOCTL_SW_CLKEN );
876
881
bgmac -> mac_speed = SPEED_2500 ;
877
882
bgmac -> mac_duplex = DUPLEX_FULL ;
878
883
bgmac_mac_speed (bgmac );
879
884
} else {
885
+ u8 imode ;
886
+
880
887
imode = (bgmac_read (bgmac , BGMAC_DEV_STATUS ) &
881
888
BGMAC_DS_MM_MASK ) >> BGMAC_DS_MM_SHIFT ;
882
889
if (imode == 0 || imode == 1 ) {
@@ -891,9 +898,7 @@ static void bgmac_miiconfig(struct bgmac *bgmac)
891
898
static void bgmac_chip_reset (struct bgmac * bgmac )
892
899
{
893
900
struct bcma_device * core = bgmac -> core ;
894
- struct bcma_bus * bus = core -> bus ;
895
- struct bcma_chipinfo * ci = & bus -> chipinfo ;
896
- u32 flags ;
901
+ u32 cmdcfg_sr ;
897
902
u32 iost ;
898
903
int i ;
899
904
@@ -916,15 +921,12 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
916
921
}
917
922
918
923
iost = bcma_aread32 (core , BCMA_IOST );
919
- if ((ci -> id == BCMA_CHIP_ID_BCM5357 && ci -> pkg == BCMA_PKG_ID_BCM47186 ) ||
920
- (ci -> id == BCMA_CHIP_ID_BCM4749 && ci -> pkg == 10 ) ||
921
- (ci -> id == BCMA_CHIP_ID_BCM53572 && ci -> pkg == BCMA_PKG_ID_BCM47188 ))
924
+ if (bgmac -> feature_flags & BGMAC_FEAT_IOST_ATTACHED )
922
925
iost &= ~BGMAC_BCMA_IOST_ATTACHED ;
923
926
924
927
/* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
925
- if (ci -> id != BCMA_CHIP_ID_BCM4707 &&
926
- ci -> id != BCMA_CHIP_ID_BCM47094 ) {
927
- flags = 0 ;
928
+ if (!(bgmac -> feature_flags & BGMAC_FEAT_NO_RESET )) {
929
+ u32 flags = 0 ;
928
930
if (iost & BGMAC_BCMA_IOST_ATTACHED ) {
929
931
flags = BGMAC_BCMA_IOCTL_SW_CLKEN ;
930
932
if (!bgmac -> has_robosw )
@@ -934,7 +936,7 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
934
936
}
935
937
936
938
/* Request Misc PLL for corerev > 2 */
937
- if (core -> id . rev > 2 && ! bgmac_is_bcm4707_family ( bgmac ) ) {
939
+ if (bgmac -> feature_flags & BGMAC_FEAT_MISC_PLL_REQ ) {
938
940
bgmac_set (bgmac , BCMA_CLKCTLST ,
939
941
BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ );
940
942
bgmac_wait_value (bgmac -> core , BCMA_CLKCTLST ,
@@ -943,9 +945,7 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
943
945
1000 );
944
946
}
945
947
946
- if (ci -> id == BCMA_CHIP_ID_BCM5357 ||
947
- ci -> id == BCMA_CHIP_ID_BCM4749 ||
948
- ci -> id == BCMA_CHIP_ID_BCM53572 ) {
948
+ if (bgmac -> feature_flags & BGMAC_FEAT_SW_TYPE_PHY ) {
949
949
struct bcma_drv_cc * cc = & bgmac -> core -> bus -> drv_cc ;
950
950
u8 et_swtype = 0 ;
951
951
u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
@@ -959,11 +959,9 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
959
959
et_swtype &= 0x0f ;
960
960
et_swtype <<= 4 ;
961
961
sw_type = et_swtype ;
962
- } else if (ci -> id == BCMA_CHIP_ID_BCM5357 && ci -> pkg == BCMA_PKG_ID_BCM5358 ) {
962
+ } else if (bgmac -> feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII ) {
963
963
sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII ;
964
- } else if ((ci -> id == BCMA_CHIP_ID_BCM5357 && ci -> pkg == BCMA_PKG_ID_BCM47186 ) ||
965
- (ci -> id == BCMA_CHIP_ID_BCM4749 && ci -> pkg == 10 ) ||
966
- (ci -> id == BCMA_CHIP_ID_BCM53572 && ci -> pkg == BCMA_PKG_ID_BCM47188 )) {
964
+ } else if (bgmac -> feature_flags & BGMAC_FEAT_SW_TYPE_RGMII ) {
967
965
sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
968
966
BGMAC_CHIPCTL_1_SW_TYPE_RGMII ;
969
967
}
@@ -983,6 +981,11 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
983
981
* BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
984
982
* be keps until taking MAC out of the reset.
985
983
*/
984
+ if (bgmac -> feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4 )
985
+ cmdcfg_sr = BGMAC_CMDCFG_SR_REV4 ;
986
+ else
987
+ cmdcfg_sr = BGMAC_CMDCFG_SR_REV0 ;
988
+
986
989
bgmac_cmdcfg_maskset (bgmac ,
987
990
~(BGMAC_CMDCFG_TE |
988
991
BGMAC_CMDCFG_RE |
@@ -1000,13 +1003,13 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
1000
1003
BGMAC_CMDCFG_PROM |
1001
1004
BGMAC_CMDCFG_NLC |
1002
1005
BGMAC_CMDCFG_CFE |
1003
- BGMAC_CMDCFG_SR ( core -> id . rev ) ,
1006
+ cmdcfg_sr ,
1004
1007
false);
1005
1008
bgmac -> mac_speed = SPEED_UNKNOWN ;
1006
1009
bgmac -> mac_duplex = DUPLEX_UNKNOWN ;
1007
1010
1008
1011
bgmac_clear_mib (bgmac );
1009
- if (core -> id . id == BCMA_CORE_4706_MAC_GBIT )
1012
+ if (bgmac -> feature_flags & BGMAC_FEAT_CMN_PHY_CTL )
1010
1013
bcma_maskset32 (bgmac -> cmn , BCMA_GMAC_CMN_PHY_CTL , ~0 ,
1011
1014
BCMA_GMAC_CMN_PC_MTE );
1012
1015
else
@@ -1032,46 +1035,48 @@ static void bgmac_chip_intrs_off(struct bgmac *bgmac)
1032
1035
/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_enable */
1033
1036
static void bgmac_enable (struct bgmac * bgmac )
1034
1037
{
1035
- struct bcma_chipinfo * ci = & bgmac -> core -> bus -> chipinfo ;
1038
+ u32 cmdcfg_sr ;
1036
1039
u32 cmdcfg ;
1037
1040
u32 mode ;
1038
- u32 rxq_ctl ;
1039
- u32 fl_ctl ;
1040
- u16 bp_clk ;
1041
- u8 mdp ;
1041
+
1042
+ if (bgmac -> feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4 )
1043
+ cmdcfg_sr = BGMAC_CMDCFG_SR_REV4 ;
1044
+ else
1045
+ cmdcfg_sr = BGMAC_CMDCFG_SR_REV0 ;
1042
1046
1043
1047
cmdcfg = bgmac_read (bgmac , BGMAC_CMDCFG );
1044
1048
bgmac_cmdcfg_maskset (bgmac , ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE ),
1045
- BGMAC_CMDCFG_SR ( bgmac -> core -> id . rev ) , true);
1049
+ cmdcfg_sr , true);
1046
1050
udelay (2 );
1047
1051
cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE ;
1048
1052
bgmac_write (bgmac , BGMAC_CMDCFG , cmdcfg );
1049
1053
1050
1054
mode = (bgmac_read (bgmac , BGMAC_DEV_STATUS ) & BGMAC_DS_MM_MASK ) >>
1051
1055
BGMAC_DS_MM_SHIFT ;
1052
- if (ci -> id != BCMA_CHIP_ID_BCM47162 || mode != 0 )
1056
+ if (bgmac -> feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0 )
1053
1057
bgmac_set (bgmac , BCMA_CLKCTLST , BCMA_CLKCTLST_FORCEHT );
1054
- if (ci -> id == BCMA_CHIP_ID_BCM47162 && mode == 2 )
1058
+ if (bgmac -> feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2 )
1055
1059
bcma_chipco_chipctl_maskset (& bgmac -> core -> bus -> drv_cc , 1 , ~0 ,
1056
1060
BGMAC_CHIPCTL_1_RXC_DLL_BYPASS );
1057
1061
1058
- switch (ci -> id ) {
1059
- case BCMA_CHIP_ID_BCM5357 :
1060
- case BCMA_CHIP_ID_BCM4749 :
1061
- case BCMA_CHIP_ID_BCM53572 :
1062
- case BCMA_CHIP_ID_BCM4716 :
1063
- case BCMA_CHIP_ID_BCM47162 :
1064
- fl_ctl = 0x03cb04cb ;
1065
- if (ci -> id == BCMA_CHIP_ID_BCM5357 ||
1066
- ci -> id == BCMA_CHIP_ID_BCM4749 ||
1067
- ci -> id == BCMA_CHIP_ID_BCM53572 )
1062
+ if (bgmac -> feature_flags & (BGMAC_FEAT_FLW_CTRL1 |
1063
+ BGMAC_FEAT_FLW_CTRL2 )) {
1064
+ u32 fl_ctl ;
1065
+
1066
+ if (bgmac -> feature_flags & BGMAC_FEAT_FLW_CTRL1 )
1068
1067
fl_ctl = 0x2300e1 ;
1068
+ else
1069
+ fl_ctl = 0x03cb04cb ;
1070
+
1069
1071
bgmac_write (bgmac , BGMAC_FLOW_CTL_THRESH , fl_ctl );
1070
1072
bgmac_write (bgmac , BGMAC_PAUSE_CTL , 0x27fff );
1071
- break ;
1072
1073
}
1073
1074
1074
- if (!bgmac_is_bcm4707_family (bgmac )) {
1075
+ if (bgmac -> feature_flags & BGMAC_FEAT_SET_RXQ_CLK ) {
1076
+ u32 rxq_ctl ;
1077
+ u16 bp_clk ;
1078
+ u8 mdp ;
1079
+
1075
1080
rxq_ctl = bgmac_read (bgmac , BGMAC_RXQ_CTL );
1076
1081
rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK ;
1077
1082
bp_clk = bcma_pmu_get_bus_clock (& bgmac -> core -> bus -> drv_cc ) /
@@ -1587,6 +1592,74 @@ static int bgmac_probe(struct bcma_device *core)
1587
1592
if (core -> bus -> sprom .boardflags_lo & BGMAC_BFL_ENETADM )
1588
1593
dev_warn (bgmac -> dev , "Support for ADMtek ethernet switch not implemented\n" );
1589
1594
1595
+ /* Feature Flags */
1596
+ switch (core -> bus -> chipinfo .id ) {
1597
+ case BCMA_CHIP_ID_BCM5357 :
1598
+ bgmac -> feature_flags |= BGMAC_FEAT_SET_RXQ_CLK ;
1599
+ bgmac -> feature_flags |= BGMAC_FEAT_CLKCTLST ;
1600
+ bgmac -> feature_flags |= BGMAC_FEAT_FLW_CTRL1 ;
1601
+ bgmac -> feature_flags |= BGMAC_FEAT_SW_TYPE_PHY ;
1602
+ if (core -> bus -> chipinfo .pkg == BCMA_PKG_ID_BCM47186 ) {
1603
+ bgmac -> feature_flags |= BGMAC_FEAT_IOST_ATTACHED ;
1604
+ bgmac -> feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII ;
1605
+ }
1606
+ if (core -> bus -> chipinfo .pkg == BCMA_PKG_ID_BCM5358 )
1607
+ bgmac -> feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII ;
1608
+ break ;
1609
+ case BCMA_CHIP_ID_BCM53572 :
1610
+ bgmac -> feature_flags |= BGMAC_FEAT_SET_RXQ_CLK ;
1611
+ bgmac -> feature_flags |= BGMAC_FEAT_CLKCTLST ;
1612
+ bgmac -> feature_flags |= BGMAC_FEAT_FLW_CTRL1 ;
1613
+ bgmac -> feature_flags |= BGMAC_FEAT_SW_TYPE_PHY ;
1614
+ if (core -> bus -> chipinfo .pkg == BCMA_PKG_ID_BCM47188 ) {
1615
+ bgmac -> feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII ;
1616
+ bgmac -> feature_flags |= BGMAC_FEAT_IOST_ATTACHED ;
1617
+ }
1618
+ break ;
1619
+ case BCMA_CHIP_ID_BCM4749 :
1620
+ bgmac -> feature_flags |= BGMAC_FEAT_SET_RXQ_CLK ;
1621
+ bgmac -> feature_flags |= BGMAC_FEAT_CLKCTLST ;
1622
+ bgmac -> feature_flags |= BGMAC_FEAT_FLW_CTRL1 ;
1623
+ bgmac -> feature_flags |= BGMAC_FEAT_SW_TYPE_PHY ;
1624
+ if (core -> bus -> chipinfo .pkg == 10 ) {
1625
+ bgmac -> feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII ;
1626
+ bgmac -> feature_flags |= BGMAC_FEAT_IOST_ATTACHED ;
1627
+ }
1628
+ break ;
1629
+ case BCMA_CHIP_ID_BCM4716 :
1630
+ bgmac -> feature_flags |= BGMAC_FEAT_CLKCTLST ;
1631
+ /* fallthrough */
1632
+ case BCMA_CHIP_ID_BCM47162 :
1633
+ bgmac -> feature_flags |= BGMAC_FEAT_FLW_CTRL2 ;
1634
+ bgmac -> feature_flags |= BGMAC_FEAT_SET_RXQ_CLK ;
1635
+ break ;
1636
+ /* bcm4707_family */
1637
+ case BCMA_CHIP_ID_BCM4707 :
1638
+ case BCMA_CHIP_ID_BCM47094 :
1639
+ case BCMA_CHIP_ID_BCM53018 :
1640
+ bgmac -> feature_flags |= BGMAC_FEAT_CLKCTLST ;
1641
+ bgmac -> feature_flags |= BGMAC_FEAT_NO_RESET ;
1642
+ bgmac -> feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500 ;
1643
+ break ;
1644
+ default :
1645
+ bgmac -> feature_flags |= BGMAC_FEAT_CLKCTLST ;
1646
+ bgmac -> feature_flags |= BGMAC_FEAT_SET_RXQ_CLK ;
1647
+ }
1648
+
1649
+ if (!bgmac_is_bcm4707_family (bgmac ) && core -> id .rev > 2 )
1650
+ bgmac -> feature_flags |= BGMAC_FEAT_MISC_PLL_REQ ;
1651
+
1652
+ if (core -> id .id == BCMA_CORE_4706_MAC_GBIT ) {
1653
+ bgmac -> feature_flags |= BGMAC_FEAT_CMN_PHY_CTL ;
1654
+ bgmac -> feature_flags |= BGMAC_FEAT_NO_CLR_MIB ;
1655
+ }
1656
+
1657
+ if (core -> id .rev >= 4 ) {
1658
+ bgmac -> feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4 ;
1659
+ bgmac -> feature_flags |= BGMAC_FEAT_TX_MASK_SETUP ;
1660
+ bgmac -> feature_flags |= BGMAC_FEAT_RX_MASK_SETUP ;
1661
+ }
1662
+
1590
1663
netif_napi_add (net_dev , & bgmac -> napi , bgmac_poll , BGMAC_WEIGHT );
1591
1664
1592
1665
if (!bgmac_is_bcm4707_family (bgmac )) {
0 commit comments