24
24
#include "xgene_enet_sgmac.h"
25
25
#include "xgene_enet_xgmac.h"
26
26
27
+ #define RES_ENET_CSR 0
28
+ #define RES_RING_CSR 1
29
+ #define RES_RING_CMD 2
30
+
27
31
static void xgene_enet_init_bufpool (struct xgene_enet_desc_ring * buf_pool )
28
32
{
29
33
struct xgene_enet_raw_desc16 * raw_desc ;
@@ -746,36 +750,84 @@ static const struct net_device_ops xgene_ndev_ops = {
746
750
.ndo_set_mac_address = xgene_enet_set_mac_address ,
747
751
};
748
752
753
+ static int xgene_get_mac_address (struct device * dev ,
754
+ unsigned char * addr )
755
+ {
756
+ int ret ;
757
+
758
+ ret = device_property_read_u8_array (dev , "local-mac-address" , addr , 6 );
759
+ if (ret )
760
+ ret = device_property_read_u8_array (dev , "mac-address" ,
761
+ addr , 6 );
762
+ if (ret )
763
+ return - ENODEV ;
764
+
765
+ return ETH_ALEN ;
766
+ }
767
+
768
+ static int xgene_get_phy_mode (struct device * dev )
769
+ {
770
+ int i , ret ;
771
+ char * modestr ;
772
+
773
+ ret = device_property_read_string (dev , "phy-connection-type" ,
774
+ (const char * * )& modestr );
775
+ if (ret )
776
+ ret = device_property_read_string (dev , "phy-mode" ,
777
+ (const char * * )& modestr );
778
+ if (ret )
779
+ return - ENODEV ;
780
+
781
+ for (i = 0 ; i < PHY_INTERFACE_MODE_MAX ; i ++ ) {
782
+ if (!strcasecmp (modestr , phy_modes (i )))
783
+ return i ;
784
+ }
785
+ return - ENODEV ;
786
+ }
787
+
749
788
static int xgene_enet_get_resources (struct xgene_enet_pdata * pdata )
750
789
{
751
790
struct platform_device * pdev ;
752
791
struct net_device * ndev ;
753
792
struct device * dev ;
754
793
struct resource * res ;
755
794
void __iomem * base_addr ;
756
- const char * mac ;
757
795
int ret ;
758
796
759
797
pdev = pdata -> pdev ;
760
798
dev = & pdev -> dev ;
761
799
ndev = pdata -> ndev ;
762
800
763
- res = platform_get_resource_byname (pdev , IORESOURCE_MEM , "enet_csr" );
764
- pdata -> base_addr = devm_ioremap_resource (dev , res );
801
+ res = platform_get_resource (pdev , IORESOURCE_MEM , RES_ENET_CSR );
802
+ if (!res ) {
803
+ dev_err (dev , "Resource enet_csr not defined\n" );
804
+ return - ENODEV ;
805
+ }
806
+ pdata -> base_addr = devm_ioremap (dev , res -> start , resource_size (res ));
765
807
if (IS_ERR (pdata -> base_addr )) {
766
808
dev_err (dev , "Unable to retrieve ENET Port CSR region\n" );
767
809
return PTR_ERR (pdata -> base_addr );
768
810
}
769
811
770
- res = platform_get_resource_byname (pdev , IORESOURCE_MEM , "ring_csr" );
771
- pdata -> ring_csr_addr = devm_ioremap_resource (dev , res );
812
+ res = platform_get_resource (pdev , IORESOURCE_MEM , RES_RING_CSR );
813
+ if (!res ) {
814
+ dev_err (dev , "Resource ring_csr not defined\n" );
815
+ return - ENODEV ;
816
+ }
817
+ pdata -> ring_csr_addr = devm_ioremap (dev , res -> start ,
818
+ resource_size (res ));
772
819
if (IS_ERR (pdata -> ring_csr_addr )) {
773
820
dev_err (dev , "Unable to retrieve ENET Ring CSR region\n" );
774
821
return PTR_ERR (pdata -> ring_csr_addr );
775
822
}
776
823
777
- res = platform_get_resource_byname (pdev , IORESOURCE_MEM , "ring_cmd" );
778
- pdata -> ring_cmd_addr = devm_ioremap_resource (dev , res );
824
+ res = platform_get_resource (pdev , IORESOURCE_MEM , RES_RING_CMD );
825
+ if (!res ) {
826
+ dev_err (dev , "Resource ring_cmd not defined\n" );
827
+ return - ENODEV ;
828
+ }
829
+ pdata -> ring_cmd_addr = devm_ioremap (dev , res -> start ,
830
+ resource_size (res ));
779
831
if (IS_ERR (pdata -> ring_cmd_addr )) {
780
832
dev_err (dev , "Unable to retrieve ENET Ring command region\n" );
781
833
return PTR_ERR (pdata -> ring_cmd_addr );
@@ -789,14 +841,12 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
789
841
}
790
842
pdata -> rx_irq = ret ;
791
843
792
- mac = of_get_mac_address (dev -> of_node );
793
- if (mac )
794
- memcpy (ndev -> dev_addr , mac , ndev -> addr_len );
795
- else
844
+ if (xgene_get_mac_address (dev , ndev -> dev_addr ) != ETH_ALEN )
796
845
eth_hw_addr_random (ndev );
846
+
797
847
memcpy (ndev -> perm_addr , ndev -> dev_addr , ndev -> addr_len );
798
848
799
- pdata -> phy_mode = of_get_phy_mode ( pdev -> dev . of_node );
849
+ pdata -> phy_mode = xgene_get_phy_mode ( dev );
800
850
if (pdata -> phy_mode < 0 ) {
801
851
dev_err (dev , "Unable to get phy-connection-type\n" );
802
852
return pdata -> phy_mode ;
@@ -809,11 +859,9 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
809
859
}
810
860
811
861
pdata -> clk = devm_clk_get (& pdev -> dev , NULL );
812
- ret = IS_ERR (pdata -> clk );
813
862
if (IS_ERR (pdata -> clk )) {
814
- dev_err (& pdev -> dev , "can't get clock\n" );
815
- ret = PTR_ERR (pdata -> clk );
816
- return ret ;
863
+ /* Firmware may have set up the clock already. */
864
+ pdata -> clk = NULL ;
817
865
}
818
866
819
867
base_addr = pdata -> base_addr ;
@@ -924,7 +972,7 @@ static int xgene_enet_probe(struct platform_device *pdev)
924
972
goto err ;
925
973
}
926
974
927
- ret = dma_set_mask_and_coherent (dev , DMA_BIT_MASK (64 ));
975
+ ret = dma_coerce_mask_and_coherent (dev , DMA_BIT_MASK (64 ));
928
976
if (ret ) {
929
977
netdev_err (ndev , "No usable DMA configuration\n" );
930
978
goto err ;
@@ -972,17 +1020,26 @@ static int xgene_enet_remove(struct platform_device *pdev)
972
1020
return 0 ;
973
1021
}
974
1022
975
- static struct of_device_id xgene_enet_match [] = {
1023
+ #ifdef CONFIG_ACPI
1024
+ static const struct acpi_device_id xgene_enet_acpi_match [] = {
1025
+ { "APMC0D05" , },
1026
+ { }
1027
+ };
1028
+ MODULE_DEVICE_TABLE (acpi , xgene_enet_acpi_match );
1029
+ #endif
1030
+
1031
+ static struct of_device_id xgene_enet_of_match [] = {
976
1032
{.compatible = "apm,xgene-enet" ,},
977
1033
{},
978
1034
};
979
1035
980
- MODULE_DEVICE_TABLE (of , xgene_enet_match );
1036
+ MODULE_DEVICE_TABLE (of , xgene_enet_of_match );
981
1037
982
1038
static struct platform_driver xgene_enet_driver = {
983
1039
.driver = {
984
1040
.name = "xgene-enet" ,
985
- .of_match_table = xgene_enet_match ,
1041
+ .of_match_table = of_match_ptr (xgene_enet_of_match ),
1042
+ .acpi_match_table = ACPI_PTR (xgene_enet_acpi_match ),
986
1043
},
987
1044
.probe = xgene_enet_probe ,
988
1045
.remove = xgene_enet_remove ,
0 commit comments