@@ -78,6 +78,7 @@ struct eth_dev {
78
78
79
79
bool zlp ;
80
80
u8 host_mac [ETH_ALEN ];
81
+ u8 dev_mac [ETH_ALEN ];
81
82
};
82
83
83
84
/*-------------------------------------------------------------------------*/
@@ -716,6 +717,17 @@ static int get_ether_addr(const char *str, u8 *dev_addr)
716
717
return 1 ;
717
718
}
718
719
720
+ static int get_ether_addr_str (u8 dev_addr [ETH_ALEN ], char * str , int len )
721
+ {
722
+ if (len < 18 )
723
+ return - EINVAL ;
724
+
725
+ snprintf (str , len , "%02x:%02x:%02x:%02x:%02x:%02x" ,
726
+ dev_addr [0 ], dev_addr [1 ], dev_addr [2 ],
727
+ dev_addr [3 ], dev_addr [4 ], dev_addr [5 ]);
728
+ return 18 ;
729
+ }
730
+
719
731
static const struct net_device_ops eth_netdev_ops = {
720
732
.ndo_open = eth_open ,
721
733
.ndo_stop = eth_stop ,
@@ -796,7 +808,8 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g,
796
808
INFO (dev , "MAC %pM\n" , net -> dev_addr );
797
809
INFO (dev , "HOST MAC %pM\n" , dev -> host_mac );
798
810
799
- /* two kinds of host-initiated state changes:
811
+ /*
812
+ * two kinds of host-initiated state changes:
800
813
* - iff DATA transfer is active, carrier is "on"
801
814
* - tx queueing enabled if open *and* carrier is "on"
802
815
*/
@@ -807,6 +820,176 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g,
807
820
}
808
821
EXPORT_SYMBOL (gether_setup_name );
809
822
823
+ struct net_device * gether_setup_name_default (const char * netname )
824
+ {
825
+ struct net_device * net ;
826
+ struct eth_dev * dev ;
827
+
828
+ net = alloc_etherdev (sizeof (* dev ));
829
+ if (!net )
830
+ return ERR_PTR (- ENOMEM );
831
+
832
+ dev = netdev_priv (net );
833
+ spin_lock_init (& dev -> lock );
834
+ spin_lock_init (& dev -> req_lock );
835
+ INIT_WORK (& dev -> work , eth_work );
836
+ INIT_LIST_HEAD (& dev -> tx_reqs );
837
+ INIT_LIST_HEAD (& dev -> rx_reqs );
838
+
839
+ skb_queue_head_init (& dev -> rx_frames );
840
+
841
+ /* network device setup */
842
+ dev -> net = net ;
843
+ dev -> qmult = QMULT_DEFAULT ;
844
+ snprintf (net -> name , sizeof (net -> name ), "%s%%d" , netname );
845
+
846
+ eth_random_addr (dev -> dev_mac );
847
+ pr_warn ("using random %s ethernet address\n" , "self" );
848
+ eth_random_addr (dev -> host_mac );
849
+ pr_warn ("using random %s ethernet address\n" , "host" );
850
+
851
+ net -> netdev_ops = & eth_netdev_ops ;
852
+
853
+ SET_ETHTOOL_OPS (net , & ops );
854
+ SET_NETDEV_DEVTYPE (net , & gadget_type );
855
+
856
+ return net ;
857
+ }
858
+ EXPORT_SYMBOL (gether_setup_name_default );
859
+
860
+ int gether_register_netdev (struct net_device * net )
861
+ {
862
+ struct eth_dev * dev ;
863
+ struct usb_gadget * g ;
864
+ struct sockaddr sa ;
865
+ int status ;
866
+
867
+ if (!net -> dev .parent )
868
+ return - EINVAL ;
869
+ dev = netdev_priv (net );
870
+ g = dev -> gadget ;
871
+ status = register_netdev (net );
872
+ if (status < 0 ) {
873
+ dev_dbg (& g -> dev , "register_netdev failed, %d\n" , status );
874
+ return status ;
875
+ } else {
876
+ INFO (dev , "HOST MAC %pM\n" , dev -> host_mac );
877
+
878
+ /* two kinds of host-initiated state changes:
879
+ * - iff DATA transfer is active, carrier is "on"
880
+ * - tx queueing enabled if open *and* carrier is "on"
881
+ */
882
+ netif_carrier_off (net );
883
+ }
884
+ sa .sa_family = net -> type ;
885
+ memcpy (sa .sa_data , dev -> dev_mac , ETH_ALEN );
886
+ rtnl_lock ();
887
+ status = dev_set_mac_address (net , & sa );
888
+ rtnl_unlock ();
889
+ if (status )
890
+ pr_warn ("cannot set self ethernet address: %d\n" , status );
891
+ else
892
+ INFO (dev , "MAC %pM\n" , dev -> dev_mac );
893
+
894
+ return status ;
895
+ }
896
+ EXPORT_SYMBOL (gether_register_netdev );
897
+
898
+ void gether_set_gadget (struct net_device * net , struct usb_gadget * g )
899
+ {
900
+ struct eth_dev * dev ;
901
+
902
+ dev = netdev_priv (net );
903
+ dev -> gadget = g ;
904
+ SET_NETDEV_DEV (net , & g -> dev );
905
+ }
906
+ EXPORT_SYMBOL (gether_set_gadget );
907
+
908
+ int gether_set_dev_addr (struct net_device * net , const char * dev_addr )
909
+ {
910
+ struct eth_dev * dev ;
911
+ u8 new_addr [ETH_ALEN ];
912
+
913
+ dev = netdev_priv (net );
914
+ if (get_ether_addr (dev_addr , new_addr ))
915
+ return - EINVAL ;
916
+ memcpy (dev -> dev_mac , new_addr , ETH_ALEN );
917
+ return 0 ;
918
+ }
919
+ EXPORT_SYMBOL (gether_set_dev_addr );
920
+
921
+ int gether_get_dev_addr (struct net_device * net , char * dev_addr , int len )
922
+ {
923
+ struct eth_dev * dev ;
924
+
925
+ dev = netdev_priv (net );
926
+ return get_ether_addr_str (dev -> dev_mac , dev_addr , len );
927
+ }
928
+ EXPORT_SYMBOL (gether_get_dev_addr );
929
+
930
+ int gether_set_host_addr (struct net_device * net , const char * host_addr )
931
+ {
932
+ struct eth_dev * dev ;
933
+ u8 new_addr [ETH_ALEN ];
934
+
935
+ dev = netdev_priv (net );
936
+ if (get_ether_addr (host_addr , new_addr ))
937
+ return - EINVAL ;
938
+ memcpy (dev -> host_mac , new_addr , ETH_ALEN );
939
+ return 0 ;
940
+ }
941
+ EXPORT_SYMBOL (gether_set_host_addr );
942
+
943
+ int gether_get_host_addr (struct net_device * net , char * host_addr , int len )
944
+ {
945
+ struct eth_dev * dev ;
946
+
947
+ dev = netdev_priv (net );
948
+ return get_ether_addr_str (dev -> host_mac , host_addr , len );
949
+ }
950
+ EXPORT_SYMBOL (gether_get_host_addr );
951
+
952
+ int gether_get_host_addr_cdc (struct net_device * net , char * host_addr , int len )
953
+ {
954
+ struct eth_dev * dev ;
955
+
956
+ if (len < 13 )
957
+ return - EINVAL ;
958
+
959
+ dev = netdev_priv (net );
960
+ snprintf (host_addr , len , "%pm" , dev -> host_mac );
961
+
962
+ return strlen (host_addr );
963
+ }
964
+ EXPORT_SYMBOL (gether_get_host_addr_cdc );
965
+
966
+ void gether_set_qmult (struct net_device * net , unsigned qmult )
967
+ {
968
+ struct eth_dev * dev ;
969
+
970
+ dev = netdev_priv (net );
971
+ dev -> qmult = qmult ;
972
+ }
973
+ EXPORT_SYMBOL (gether_set_qmult );
974
+
975
+ unsigned gether_get_qmult (struct net_device * net )
976
+ {
977
+ struct eth_dev * dev ;
978
+
979
+ dev = netdev_priv (net );
980
+ return dev -> qmult ;
981
+ }
982
+ EXPORT_SYMBOL (gether_get_qmult );
983
+
984
+ int gether_get_ifname (struct net_device * net , char * name , int len )
985
+ {
986
+ rtnl_lock ();
987
+ strlcpy (name , netdev_name (net ), len );
988
+ rtnl_unlock ();
989
+ return strlen (name );
990
+ }
991
+ EXPORT_SYMBOL (gether_get_ifname );
992
+
810
993
/**
811
994
* gether_cleanup - remove Ethernet-over-USB device
812
995
* Context: may sleep
0 commit comments