From 9abf88c1955874357a9e832f05ca217c85f7c509 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 5 Mar 2013 15:19:54 +0100 Subject: [PATCH] usb: add network support for arndale board --- dde_linux/Makefile | 9 ++- dde_linux/lib/mk/platform_arndale/usb.mk | 6 +- dde_linux/patches/asix.patch | 55 +++++++++++++++++ dde_linux/run/usb_net.run | 3 +- .../lib/usb/arm/platform_arndale/platform.cc | 8 +++ .../lib/usb/arm/platform_panda/platform.cc | 2 +- dde_linux/src/lib/usb/include/lx_emul.h | 60 ++++++++++++++++++- dde_linux/src/lib/usb/lx_emul.cc | 2 +- 8 files changed, 135 insertions(+), 10 deletions(-) create mode 100644 dde_linux/patches/asix.patch diff --git a/dde_linux/Makefile b/dde_linux/Makefile index c9a24b257..c65d3da89 100644 --- a/dde_linux/Makefile +++ b/dde_linux/Makefile @@ -57,8 +57,13 @@ CONTENT_INPUT := input.c evdev.c input-compat.h CONTENT += $(addprefix drivers/input/,$(CONTENT_INPUT)) CONTENT += include/linux/input/mt.h -# Panda board usb network driver -CONTENT_NET = usbnet.c smsc95xx.c smsc95xx.h +# usb network driver +CONTENT_NET = usbnet.c +# Panda board +CONTENT_NET += smsc95xx.c smsc95xx.h +# Arndale board +CONTENT_NET += asix.c + CONTENT += $(addprefix drivers/net/usb/,$(CONTENT_NET)) CONTENT += include/linux/usb/usbnet.h diff --git a/dde_linux/lib/mk/platform_arndale/usb.mk b/dde_linux/lib/mk/platform_arndale/usb.mk index f8915f11b..8972caa12 100644 --- a/dde_linux/lib/mk/platform_arndale/usb.mk +++ b/dde_linux/lib/mk/platform_arndale/usb.mk @@ -3,10 +3,8 @@ include $(REP_DIR)/lib/mk/arm/usb.inc CC_OPT += -DCONFIG_USB_EHCI_S5P -DCONFIG_USB_EHCI_TT_NEWSCHED INC_DIR += $(CONTRIB_DIR)/arch/arm/plat-samsung/include +SRC_C += usbnet.c asix.c SRC_CC += platform.cc vpath platform.cc $(LIB_DIR)/arm/platform_arndale - - - - +vpath %.c $(CONTRIB_DIR)/drivers/net/usb diff --git a/dde_linux/patches/asix.patch b/dde_linux/patches/asix.patch new file mode 100644 index 000000000..81a6a1595 --- /dev/null +++ b/dde_linux/patches/asix.patch @@ -0,0 +1,55 @@ +--- download/linux-3.2.2/drivers/net/usb/asix.c 2012-01-26 01:39:32.000000000 +0100 ++++ contrib/drivers/net/usb/asix.c 2013-03-18 15:36:10.106168580 +0100 +@@ -191,7 +191,7 @@ + netdev_dbg(dev->net, "asix_read_cmd() cmd=0x%02x value=0x%04x index=0x%04x size=%d\n", + cmd, value, index, size); + +- buf = kmalloc(size, GFP_KERNEL); ++ buf = kmalloc(size, GFP_NOIO); + if (!buf) + goto out; + +@@ -225,7 +225,7 @@ + cmd, value, index, size); + + if (data) { +- buf = kmemdup(data, size, GFP_KERNEL); ++ buf = kmemdup(data, size, GFP_NOIO); + if (!buf) + goto out; + } +@@ -270,13 +270,13 @@ + netdev_dbg(dev->net, "asix_write_cmd_async() cmd=0x%02x value=0x%04x index=0x%04x size=%d\n", + cmd, value, index, size); + +- urb = usb_alloc_urb(0, GFP_ATOMIC); ++ urb = usb_alloc_urb(0, GFP_NOIO); + if (!urb) { + netdev_err(dev->net, "Error allocating URB in write_cmd_async!\n"); + return; + } + +- req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC); ++ req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); + if (!req) { + netdev_err(dev->net, "Failed to allocate memory for control request\n"); + usb_free_urb(urb); +@@ -294,7 +294,7 @@ + (void *)req, data, size, + asix_async_cmd_callback, req); + +- status = usb_submit_urb(urb, GFP_ATOMIC); ++ status = usb_submit_urb(urb, GFP_NOIO); + if (status < 0) { + netdev_err(dev->net, "Error submitting the control message: status=%d\n", + status); +@@ -1051,6 +1051,9 @@ + dbg("Write IPG,IPG1,IPG2 failed: %d", ret); + goto out; + } ++ ++ if (!is_valid_ether_addr(dev->net->dev_addr)) ++ random_ether_addr(dev->net->dev_addr); + + /* Rewrite MAC address */ + memcpy(data->mac_addr, dev->net->dev_addr, ETH_ALEN); diff --git a/dde_linux/run/usb_net.run b/dde_linux/run/usb_net.run index fd1202b00..bb2af4cd1 100644 --- a/dde_linux/run/usb_net.run +++ b/dde_linux/run/usb_net.run @@ -49,7 +49,7 @@ set config { - + @@ -106,4 +106,5 @@ lappend_if [have_spec nova] boot_modules pci_device_pd build_boot_image $boot_modules +run_genode_until forever # vi: set ft=tcl : diff --git a/dde_linux/src/lib/usb/arm/platform_arndale/platform.cc b/dde_linux/src/lib/usb/arm/platform_arndale/platform.cc index 17f29e609..226bddb5f 100644 --- a/dde_linux/src/lib/usb/arm/platform_arndale/platform.cc +++ b/dde_linux/src/lib/usb/arm/platform_arndale/platform.cc @@ -136,9 +136,17 @@ static void arndale_ehci_init() extern "C" void module_ehci_hcd_init(); +extern "C" int module_usbnet_init(); +extern "C" int module_asix_init(); void platform_hcd_init(Services *services) { + /* register network */ + if (services->nic) { + module_usbnet_init(); + module_asix_init(); + } + /* register EHCI controller */ module_ehci_hcd_init(); diff --git a/dde_linux/src/lib/usb/arm/platform_panda/platform.cc b/dde_linux/src/lib/usb/arm/platform_panda/platform.cc index fb1bb8a7f..b88159302 100644 --- a/dde_linux/src/lib/usb/arm/platform_panda/platform.cc +++ b/dde_linux/src/lib/usb/arm/platform_panda/platform.cc @@ -370,7 +370,7 @@ extern "C" int module_smsc95xx_init(); void platform_hcd_init(Services *services) { - /* register netowrk */ + /* register network */ if (services->nic) { module_usbnet_init(); module_smsc95xx_init(); diff --git a/dde_linux/src/lib/usb/include/lx_emul.h b/dde_linux/src/lib/usb/include/lx_emul.h index c27611878..5fdb4ebbc 100644 --- a/dde_linux/src/lib/usb/include/lx_emul.h +++ b/dde_linux/src/lib/usb/include/lx_emul.h @@ -426,6 +426,7 @@ enum { EOPNOTSUPP = 48, EDOM = 49, ENOLINK = 50, + EADDRNOTAVAIL= 51, }; static inline bool IS_ERR(void *ptr) { @@ -647,6 +648,7 @@ char * strsep(char **,const char *); char *strstr(const char *, const char *); char *kstrdup(const char *s, gfp_t gfp); void *kmemdup(const void *src, size_t len, gfp_t gfp); +void *memmove(void *, const void *, size_t); /***************** @@ -690,6 +692,7 @@ int isprint(int); #define EXPORT_SYMBOL(x) #define EXPORT_SYMBOL_GPL(x) #define MODULE_AUTHOR(x) +#define MODULE_VERSION(x) #define MODULE_DESCRIPTION(x) #define MODULE_LICENSE(x) #define MODULE_PARM_DESC(x, y) @@ -2666,6 +2669,7 @@ struct sk_buff __be16 protocol; unsigned char *start; unsigned char *end; + unsigned char *head; unsigned char *data; unsigned char *tail; unsigned char *phys; @@ -2704,6 +2708,13 @@ void skb_set_tail_pointer(struct sk_buff *, const int); struct sk_buff *skb_clone(struct sk_buff *, gfp_t); void skb_reserve(struct sk_buff *, int); +static inline int skb_cloned(const struct sk_buff *skb) { + return skb->cloned; } +static inline void skb_copy_to_linear_data(struct sk_buff *skb, + const void *from, + const unsigned int len) { + memcpy(skb->data, from, len); } + struct sk_buff *skb_dequeue(struct sk_buff_head *); void skb_queue_head_init(struct sk_buff_head *); void skb_queue_tail(struct sk_buff_head *, struct sk_buff *); @@ -2739,6 +2750,7 @@ struct ifreq { }; enum { ETH_ALEN = 6, /* octets in one ethernet addr */ + ETH_HLEN = 14, /* total octets in header */ ETH_P_8021Q = 0x8100, /* 802.1Q VLAN Extended Header */ ETH_FRAME_LEN = 1514, @@ -2754,6 +2766,12 @@ enum { ETHTOOL_GSET = 0x1, ETHTOOL_FWVERS_LEN = 32, ETHTOOL_BUSINFO_LEN = 32, + + WAKE_PHY = 0x1, + WAKE_MAGIC = 0x20, + + SPEED_100 = 100, + SPEED_1000 = 1000, }; @@ -2777,6 +2795,12 @@ struct ethtool_drvinfo char fw_version[ETHTOOL_FWVERS_LEN]; /* firmware version string */ char bus_info[ETHTOOL_BUSINFO_LEN]; /* Bus info for this IF. */ /* For PCI devices, use pci_name(pci_dev). */ + u32 eedump_len; +}; + +struct ethtool_wolinfo { + u32 supported; + u32 wolopts; }; struct ethhdr { }; @@ -2795,6 +2819,8 @@ struct ethtool_ops int (*set_eeprom)(struct net_device *, struct ethtool_eeprom *, u8 *); u32 (*get_msglevel)(struct net_device *); void (*set_msglevel)(struct net_device *, u32); + void (*get_wol)(struct net_device *, struct ethtool_wolinfo *); + int (*set_wol)(struct net_device *, struct ethtool_wolinfo *); }; __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep); @@ -2816,7 +2842,7 @@ u32 ethtool_op_get_link(struct net_device *); #if VERBOSE_LX_EMUL #define netif_dbg(priv, type, dev, fmt, args...) dde_kit_printf("netif_dbg: " fmt, ## args) -#define netdev_dbg(dev, fmt, args...) dde_kit_printf("nedev_dbg: " fmt, ##args) +#define netdev_dbg(dev, fmt, args...) dde_kit_printf("netdev_dbg: " fmt, ##args) #else #define netif_dbg(priv, type, dev, fmt, args...) #define netdev_dbg(dev, fmt, args...) @@ -2901,9 +2927,25 @@ struct netdev_hw_addr unsigned char addr[MAX_ADDR_LEN]; }; +enum netdev_state_t { + __LINK_STATE_START, + __LINK_STATE_PRESENT, + __LINK_STATE_NOCARRIER, + __LINK_STATE_LINKWATCH_PENDING, + __LINK_STATE_DORMANT, +}; + #define netif_msg_tx_err(p) ({ printk("netif_msg_tx_err called not implemented\n"); 0; }) #define netif_msg_rx_err(p) ({ printk("netif_msg_rx_err called not implemented\n"); 0; }) #define netif_msg_tx_queued(p) ({ printk("netif_msg_tx_queued called not implemented\n"); 0; }) +static inline int netif_carrier_ok(const struct net_device *dev) { + return !test_bit(__LINK_STATE_NOCARRIER, &dev->state); +} +#define netif_carrier_on(p) ({ printk("netif_carrier_on called not implemented\n"); 0; }) +static inline unsigned netdev_mc_count(struct net_device * dev) { + printk("netdev_mc_count called not implemented\n"); + return 0; +} u32 netif_msg_init(int, int); @@ -2933,10 +2975,14 @@ enum { FLOW_CTRL_RX = 0x2, MII_BMCR = 0x0, + MII_PHYSID1 = 0x2, + MII_PHYSID2 = 0x3, MII_ADVERTISE = 0x4, MII_LPA = 0x5, + MII_CTRL1000 = 0x9, BMCR_RESET = 0x8000, /* reset to default state */ + BMCR_ANENABLE = 0x1000, /* enable auto negotiation */ ADVERTISE_PAUSE_CAP = 0x0400, /* try for pause */ ADVERTISE_CSMA = 0x0001, /* only selector supported */ @@ -2945,6 +2991,7 @@ enum { ADVERTISE_10FULL = 0x0040, ADVERTISE_100HALF = 0x0080, ADVERTISE_100FULL = 0x0100, + ADVERTISE_1000FULL = 0x0200, ADVERTISE_ALL = ADVERTISE_10HALF | ADVERTISE_10FULL | ADVERTISE_100HALF | ADVERTISE_100FULL }; @@ -2957,6 +3004,8 @@ struct mii_if_info struct net_device *dev; int (*mdio_read) (struct net_device *dev, int phy_id, int location); void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val); + + unsigned int supports_gmii : 1; /* are GMII registers supported? */ }; @@ -3008,6 +3057,15 @@ struct net_device *alloc_etherdev(int); __wsum csum_partial(const void *, int, __wsum); __sum16 csum_fold(__wsum); +/******************** + ** linux/socket.h ** + ********************/ + +struct sockaddr { + unsigned short sa_family; + char sa_data[14]; +}; + /********************************** ** Platform specific defintions ** *********************************/ diff --git a/dde_linux/src/lib/usb/lx_emul.cc b/dde_linux/src/lib/usb/lx_emul.cc index b7a5c61d9..27d1eb3b5 100644 --- a/dde_linux/src/lib/usb/lx_emul.cc +++ b/dde_linux/src/lib/usb/lx_emul.cc @@ -531,7 +531,7 @@ size_t strlcat(char *dest, const char *src, size_t n) void *kmemdup(const void *src, size_t len, gfp_t gfp) { - void *ptr = kmalloc(len, 0); + void *ptr = kmalloc(len, gfp); memcpy(ptr, src, len); return ptr; }