diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-11-05 23:46:06 +0100 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2015-11-05 23:46:06 +0100 |
commit | a41984e726601b2f6cf61e3128aba84f7a85436c (patch) | |
tree | 6d1156eb0d5779bda12592eca6f2c9ca93722a09 | |
parent | 573055eb4f44e819f983f083c52716bdec8edf14 (diff) |
sync with upstream packaging
53 files changed, 2281 insertions, 4390 deletions
diff --git a/debian/patches/libdde_addr_fix.patch b/debian/patches/libdde_addr_fix.patch deleted file mode 100644 index 8ea9a7de..00000000 --- a/debian/patches/libdde_addr_fix.patch +++ /dev/null @@ -1,37 +0,0 @@ -commit 0c27922e4933ceb86644f4a9b1af212ffe5aad75 -Author: Eric Dumazet <eric.dumazet@gmail.com> -Date: Mon Jun 8 03:49:24 2009 +0000 - - net: dev_addr_init() fix - - commit f001fde5eadd915f4858d22ed70d7040f48767cf - (net: introduce a list of device addresses dev_addr_list (v6)) - added one regression Vegard Nossum found in its testings. - - With kmemcheck help, Vegard found some uninitialized memory - was read and reported to user, potentialy leaking kernel data. - ( thread can be found on http://lkml.org/lkml/2009/5/30/177 ) - - dev_addr_init() incorrectly uses sizeof() operator. We were - initializing one byte instead of MAX_ADDR_LEN bytes. - - Reported-by: Vegard Nossum <vegard.nossum@gmail.com> - Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> - Acked-by: Jiri Pirko <jpirko@redhat.com> - Signed-off-by: David S. Miller <davem@davemloft.net> - -diff --git a/net/core/dev.c b/net/core/dev.c -index 4913089..81b392e 100644 ---- a/libdde-linux26/lib/src/net/core/dev.c -+++ b/libdde-linux26/lib/src/net/core/dev.c -@@ -3577,8 +3577,8 @@ static int dev_addr_init(struct net_device *dev) - /* rtnl_mutex must be held here */ - - INIT_LIST_HEAD(&dev->dev_addr_list); -- memset(addr, 0, sizeof(*addr)); -- err = __hw_addr_add(&dev->dev_addr_list, NULL, addr, sizeof(*addr), -+ memset(addr, 0, sizeof(addr)); -+ err = __hw_addr_add(&dev->dev_addr_list, NULL, addr, sizeof(addr), - NETDEV_HW_ADDR_T_LAN); - if (!err) { - /* diff --git a/debian/patches/libdde_addr_list.patch b/debian/patches/libdde_addr_list.patch deleted file mode 100644 index ccca7a1a..00000000 --- a/debian/patches/libdde_addr_list.patch +++ /dev/null @@ -1,423 +0,0 @@ -commit f001fde5eadd915f4858d22ed70d7040f48767cf -Author: Jiri Pirko <jpirko@redhat.com> -Date: Tue May 5 02:48:28 2009 +0000 - - net: introduce a list of device addresses dev_addr_list (v6) - - v5 -> v6 (current): - -removed so far unused static functions - -corrected dev_addr_del_multiple to call del instead of add - - v4 -> v5: - -added device address type (suggested by davem) - -removed refcounting (better to have simplier code then safe potentially few - bytes) - - v3 -> v4: - -changed kzalloc to kmalloc in __hw_addr_add_ii() - -ASSERT_RTNL() avoided in dev_addr_flush() and dev_addr_init() - - v2 -> v3: - -removed unnecessary rcu read locking - -moved dev_addr_flush() calling to ensure no null dereference of dev_addr - - v1 -> v2: - -added forgotten ASSERT_RTNL to dev_addr_init and dev_addr_flush - -removed unnecessary rcu_read locking in dev_addr_init - -use compare_ether_addr_64bits instead of compare_ether_addr - -use L1_CACHE_BYTES as size for allocating struct netdev_hw_addr - -use call_rcu instead of rcu_synchronize - -moved is_etherdev_addr into __KERNEL__ ifdef - - This patch introduces a new list in struct net_device and brings a set of - functions to handle the work with device address list. The list is a replacement - for the original dev_addr field and because in some situations there is need to - carry several device addresses with the net device. To be backward compatible, - dev_addr is made to point to the first member of the list so original drivers - sees no difference. - - Signed-off-by: Jiri Pirko <jpirko@redhat.com> - Signed-off-by: David S. Miller <davem@davemloft.net> - -Index: hurd-debian/libdde-linux26/contrib/include/linux/etherdevice.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/etherdevice.h 2012-04-16 00:26:43.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/etherdevice.h 2012-04-16 00:34:43.000000000 +0000 -@@ -182,6 +182,33 @@ - return compare_ether_addr(addr1, addr2); - #endif - } -+ -+/** -+ * is_etherdev_addr - Tell if given Ethernet address belongs to the device. -+ * @dev: Pointer to a device structure -+ * @addr: Pointer to a six-byte array containing the Ethernet address -+ * -+ * Compare passed address with all addresses of the device. Return true if the -+ * address if one of the device addresses. -+ * -+ * Note that this function calls compare_ether_addr_64bits() so take care of -+ * the right padding. -+ */ -+static inline bool is_etherdev_addr(const struct net_device *dev, -+ const u8 addr[6 + 2]) -+{ -+ struct netdev_hw_addr *ha; -+ int res = 1; -+ -+ rcu_read_lock(); -+ for_each_dev_addr(dev, ha) { -+ res = compare_ether_addr_64bits(addr, ha->addr); -+ if (!res) -+ break; -+ } -+ rcu_read_unlock(); -+ return !res; -+} - #endif /* __KERNEL__ */ - - #endif /* _LINUX_ETHERDEVICE_H */ -Index: hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:33:34.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:34:43.000000000 +0000 -@@ -211,6 +211,16 @@ - #define dmi_users da_users - #define dmi_gusers da_gusers - -+struct netdev_hw_addr { -+ struct list_head list; -+ unsigned char addr[MAX_ADDR_LEN]; -+ unsigned char type; -+#define NETDEV_HW_ADDR_T_LAN 1 -+#define NETDEV_HW_ADDR_T_SAN 2 -+#define NETDEV_HW_ADDR_T_SLAVE 3 -+ struct rcu_head rcu_head; -+}; -+ - struct hh_cache - { - struct hh_cache *hh_next; /* Next entry */ -@@ -757,8 +767,11 @@ - */ - unsigned long last_rx; /* Time of last Rx */ - /* Interface address info used in eth_type_trans() */ -- unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast -- because most packets are unicast) */ -+ unsigned char *dev_addr; /* hw address, (before bcast -+ because most packets are -+ unicast) */ -+ -+ struct list_head dev_addr_list; /* list of device hw addresses */ - - unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ - -@@ -1768,6 +1781,13 @@ - spin_unlock_bh(&dev->addr_list_lock); - } - -+/* -+ * dev_addr_list walker. Should be used only for read access. Call with -+ * rcu_read_lock held. -+ */ -+#define for_each_dev_addr(dev, ha) \ -+ list_for_each_entry_rcu(ha, &dev->dev_addr_list, list) -+ - /* These functions live elsewhere (drivers/net/net_init.c, but related) */ - - extern void ether_setup(struct net_device *dev); -@@ -1780,6 +1800,19 @@ - alloc_netdev_mq(sizeof_priv, name, setup, 1) - extern int register_netdev(struct net_device *dev); - extern void unregister_netdev(struct net_device *dev); -+ -+/* Functions used for device addresses handling */ -+extern int dev_addr_add(struct net_device *dev, unsigned char *addr, -+ unsigned char addr_type); -+extern int dev_addr_del(struct net_device *dev, unsigned char *addr, -+ unsigned char addr_type); -+extern int dev_addr_add_multiple(struct net_device *to_dev, -+ struct net_device *from_dev, -+ unsigned char addr_type); -+extern int dev_addr_del_multiple(struct net_device *to_dev, -+ struct net_device *from_dev, -+ unsigned char addr_type); -+ - /* Functions used for secondary unicast and multicast support */ - extern void dev_set_rx_mode(struct net_device *dev); - extern void __dev_set_rx_mode(struct net_device *dev); -Index: hurd-debian/libdde-linux26/lib/src/net/core/dev.c -=================================================================== ---- hurd-debian.orig/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:26:43.000000000 +0000 -+++ hurd-debian/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:34:43.000000000 +0000 -@@ -3397,6 +3397,252 @@ - netif_addr_unlock_bh(dev); - } - -+/* hw addresses list handling functions */ -+ -+static int __hw_addr_add(struct list_head *list, unsigned char *addr, -+ int addr_len, unsigned char addr_type) -+{ -+ struct netdev_hw_addr *ha; -+ int alloc_size; -+ -+ if (addr_len > MAX_ADDR_LEN) -+ return -EINVAL; -+ -+ alloc_size = sizeof(*ha); -+ if (alloc_size < L1_CACHE_BYTES) -+ alloc_size = L1_CACHE_BYTES; -+ ha = kmalloc(alloc_size, GFP_ATOMIC); -+ if (!ha) -+ return -ENOMEM; -+ memcpy(ha->addr, addr, addr_len); -+ ha->type = addr_type; -+ list_add_tail_rcu(&ha->list, list); -+ return 0; -+} -+ -+static void ha_rcu_free(struct rcu_head *head) -+{ -+ struct netdev_hw_addr *ha; -+ -+ ha = container_of(head, struct netdev_hw_addr, rcu_head); -+ kfree(ha); -+} -+ -+static int __hw_addr_del_ii(struct list_head *list, unsigned char *addr, -+ int addr_len, unsigned char addr_type, -+ int ignore_index) -+{ -+ struct netdev_hw_addr *ha; -+ int i = 0; -+ -+ list_for_each_entry(ha, list, list) { -+ if (i++ != ignore_index && -+ !memcmp(ha->addr, addr, addr_len) && -+ (ha->type == addr_type || !addr_type)) { -+ list_del_rcu(&ha->list); -+ call_rcu(&ha->rcu_head, ha_rcu_free); -+ return 0; -+ } -+ } -+ return -ENOENT; -+} -+ -+static int __hw_addr_add_multiple_ii(struct list_head *to_list, -+ struct list_head *from_list, -+ int addr_len, unsigned char addr_type, -+ int ignore_index) -+{ -+ int err; -+ struct netdev_hw_addr *ha, *ha2; -+ unsigned char type; -+ -+ list_for_each_entry(ha, from_list, list) { -+ type = addr_type ? addr_type : ha->type; -+ err = __hw_addr_add(to_list, ha->addr, addr_len, type); -+ if (err) -+ goto unroll; -+ } -+ return 0; -+ -+unroll: -+ list_for_each_entry(ha2, from_list, list) { -+ if (ha2 == ha) -+ break; -+ type = addr_type ? addr_type : ha2->type; -+ __hw_addr_del_ii(to_list, ha2->addr, addr_len, type, -+ ignore_index); -+ } -+ return err; -+} -+ -+static void __hw_addr_del_multiple_ii(struct list_head *to_list, -+ struct list_head *from_list, -+ int addr_len, unsigned char addr_type, -+ int ignore_index) -+{ -+ struct netdev_hw_addr *ha; -+ unsigned char type; -+ -+ list_for_each_entry(ha, from_list, list) { -+ type = addr_type ? addr_type : ha->type; -+ __hw_addr_del_ii(to_list, ha->addr, addr_len, addr_type, -+ ignore_index); -+ } -+} -+ -+static void __hw_addr_flush(struct list_head *list) -+{ -+ struct netdev_hw_addr *ha, *tmp; -+ -+ list_for_each_entry_safe(ha, tmp, list, list) { -+ list_del_rcu(&ha->list); -+ call_rcu(&ha->rcu_head, ha_rcu_free); -+ } -+} -+ -+/* Device addresses handling functions */ -+ -+static void dev_addr_flush(struct net_device *dev) -+{ -+ /* rtnl_mutex must be held here */ -+ -+ __hw_addr_flush(&dev->dev_addr_list); -+ dev->dev_addr = NULL; -+} -+ -+static int dev_addr_init(struct net_device *dev) -+{ -+ unsigned char addr[MAX_ADDR_LEN]; -+ struct netdev_hw_addr *ha; -+ int err; -+ -+ /* rtnl_mutex must be held here */ -+ -+ INIT_LIST_HEAD(&dev->dev_addr_list); -+ memset(addr, 0, sizeof(*addr)); -+ err = __hw_addr_add(&dev->dev_addr_list, addr, sizeof(*addr), -+ NETDEV_HW_ADDR_T_LAN); -+ if (!err) { -+ /* -+ * Get the first (previously created) address from the list -+ * and set dev_addr pointer to this location. -+ */ -+ ha = list_first_entry(&dev->dev_addr_list, -+ struct netdev_hw_addr, list); -+ dev->dev_addr = ha->addr; -+ } -+ return err; -+} -+ -+/** -+ * dev_addr_add - Add a device address -+ * @dev: device -+ * @addr: address to add -+ * @addr_type: address type -+ * -+ * Add a device address to the device or increase the reference count if -+ * it already exists. -+ * -+ * The caller must hold the rtnl_mutex. -+ */ -+int dev_addr_add(struct net_device *dev, unsigned char *addr, -+ unsigned char addr_type) -+{ -+ int err; -+ -+ ASSERT_RTNL(); -+ -+ err = __hw_addr_add(&dev->dev_addr_list, addr, dev->addr_len, -+ addr_type); -+ if (!err) -+ call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); -+ return err; -+} -+EXPORT_SYMBOL(dev_addr_add); -+ -+/** -+ * dev_addr_del - Release a device address. -+ * @dev: device -+ * @addr: address to delete -+ * @addr_type: address type -+ * -+ * Release reference to a device address and remove it from the device -+ * if the reference count drops to zero. -+ * -+ * The caller must hold the rtnl_mutex. -+ */ -+int dev_addr_del(struct net_device *dev, unsigned char *addr, -+ unsigned char addr_type) -+{ -+ int err; -+ -+ ASSERT_RTNL(); -+ -+ err = __hw_addr_del_ii(&dev->dev_addr_list, addr, dev->addr_len, -+ addr_type, 0); -+ if (!err) -+ call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); -+ return err; -+} -+EXPORT_SYMBOL(dev_addr_del); -+ -+/** -+ * dev_addr_add_multiple - Add device addresses from another device -+ * @to_dev: device to which addresses will be added -+ * @from_dev: device from which addresses will be added -+ * @addr_type: address type - 0 means type will be used from from_dev -+ * -+ * Add device addresses of the one device to another. -+ ** -+ * The caller must hold the rtnl_mutex. -+ */ -+int dev_addr_add_multiple(struct net_device *to_dev, -+ struct net_device *from_dev, -+ unsigned char addr_type) -+{ -+ int err; -+ -+ ASSERT_RTNL(); -+ -+ if (from_dev->addr_len != to_dev->addr_len) -+ return -EINVAL; -+ err = __hw_addr_add_multiple_ii(&to_dev->dev_addr_list, -+ &from_dev->dev_addr_list, -+ to_dev->addr_len, addr_type, 0); -+ if (!err) -+ call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); -+ return err; -+} -+EXPORT_SYMBOL(dev_addr_add_multiple); -+ -+/** -+ * dev_addr_del_multiple - Delete device addresses by another device -+ * @to_dev: device where the addresses will be deleted -+ * @from_dev: device by which addresses the addresses will be deleted -+ * @addr_type: address type - 0 means type will used from from_dev -+ * -+ * Deletes addresses in to device by the list of addresses in from device. -+ * -+ * The caller must hold the rtnl_mutex. -+ */ -+int dev_addr_del_multiple(struct net_device *to_dev, -+ struct net_device *from_dev, -+ unsigned char addr_type) -+{ -+ ASSERT_RTNL(); -+ -+ if (from_dev->addr_len != to_dev->addr_len) -+ return -EINVAL; -+ __hw_addr_del_multiple_ii(&to_dev->dev_addr_list, -+ &from_dev->dev_addr_list, -+ to_dev->addr_len, addr_type, 0); -+ call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); -+ return 0; -+} -+EXPORT_SYMBOL(dev_addr_del_multiple); -+ -+/* unicast and multicast addresses handling functions */ -+ - int __dev_addr_delete(struct dev_addr_list **list, int *count, - void *addr, int alen, int glbl) - { -@@ -4737,6 +4983,7 @@ - - dev->gso_max_size = GSO_MAX_SIZE; - -+ dev_addr_init(dev); - netdev_init_queues(dev); - - INIT_LIST_HEAD(&dev->napi_list); -@@ -4762,6 +5009,9 @@ - - kfree(dev->_tx); - -+ /* Flush device addresses */ -+ dev_addr_flush(dev); -+ - list_for_each_entry_safe(p, n, &dev->napi_list, dev_list) - netif_napi_del(p); - diff --git a/debian/patches/libdde_devres.patch b/debian/patches/libdde_devres.patch deleted file mode 100644 index 697fdbe8..00000000 --- a/debian/patches/libdde_devres.patch +++ /dev/null @@ -1,366 +0,0 @@ ---- /dev/null 2011-08-03 18:03:30.000000000 +0000 -+++ b/libdde-linux26/contrib/lib/devres.c 2012-04-15 23:14:01.000000000 +0000 -@@ -0,0 +1,351 @@ -+#include <linux/pci.h> -+#include <linux/io.h> -+#include <linux/module.h> -+ -+void devm_ioremap_release(struct device *dev, void *res) -+{ -+ iounmap(*(void __iomem **)res); -+} -+ -+static int devm_ioremap_match(struct device *dev, void *res, void *match_data) -+{ -+ return *(void **)res == match_data; -+} -+ -+/** -+ * devm_ioremap - Managed ioremap() -+ * @dev: Generic device to remap IO address for -+ * @offset: BUS offset to map -+ * @size: Size of map -+ * -+ * Managed ioremap(). Map is automatically unmapped on driver detach. -+ */ -+void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, -+ unsigned long size) -+{ -+ void __iomem **ptr, *addr; -+ -+ ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); -+ if (!ptr) -+ return NULL; -+ -+ addr = ioremap(offset, size); -+ if (addr) { -+ *ptr = addr; -+ devres_add(dev, ptr); -+ } else -+ devres_free(ptr); -+ -+ return addr; -+} -+EXPORT_SYMBOL(devm_ioremap); -+ -+/** -+ * devm_ioremap_nocache - Managed ioremap_nocache() -+ * @dev: Generic device to remap IO address for -+ * @offset: BUS offset to map -+ * @size: Size of map -+ * -+ * Managed ioremap_nocache(). Map is automatically unmapped on driver -+ * detach. -+ */ -+void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, -+ unsigned long size) -+{ -+ void __iomem **ptr, *addr; -+ -+ ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); -+ if (!ptr) -+ return NULL; -+ -+ addr = ioremap_nocache(offset, size); -+ if (addr) { -+ *ptr = addr; -+ devres_add(dev, ptr); -+ } else -+ devres_free(ptr); -+ -+ return addr; -+} -+EXPORT_SYMBOL(devm_ioremap_nocache); -+ -+/** -+ * devm_iounmap - Managed iounmap() -+ * @dev: Generic device to unmap for -+ * @addr: Address to unmap -+ * -+ * Managed iounmap(). @addr must have been mapped using devm_ioremap*(). -+ */ -+void devm_iounmap(struct device *dev, void __iomem *addr) -+{ -+ iounmap(addr); -+ WARN_ON(devres_destroy(dev, devm_ioremap_release, devm_ioremap_match, -+ (void *)addr)); -+} -+EXPORT_SYMBOL(devm_iounmap); -+ -+#ifdef CONFIG_HAS_IOPORT -+/* -+ * Generic iomap devres -+ */ -+static void devm_ioport_map_release(struct device *dev, void *res) -+{ -+ ioport_unmap(*(void __iomem **)res); -+} -+ -+static int devm_ioport_map_match(struct device *dev, void *res, -+ void *match_data) -+{ -+ return *(void **)res == match_data; -+} -+ -+/** -+ * devm_ioport_map - Managed ioport_map() -+ * @dev: Generic device to map ioport for -+ * @port: Port to map -+ * @nr: Number of ports to map -+ * -+ * Managed ioport_map(). Map is automatically unmapped on driver -+ * detach. -+ */ -+void __iomem * devm_ioport_map(struct device *dev, unsigned long port, -+ unsigned int nr) -+{ -+ void __iomem **ptr, *addr; -+ -+ ptr = devres_alloc(devm_ioport_map_release, sizeof(*ptr), GFP_KERNEL); -+ if (!ptr) -+ return NULL; -+ -+ addr = ioport_map(port, nr); -+ if (addr) { -+ *ptr = addr; -+ devres_add(dev, ptr); -+ } else -+ devres_free(ptr); -+ -+ return addr; -+} -+EXPORT_SYMBOL(devm_ioport_map); -+ -+/** -+ * devm_ioport_unmap - Managed ioport_unmap() -+ * @dev: Generic device to unmap for -+ * @addr: Address to unmap -+ * -+ * Managed ioport_unmap(). @addr must have been mapped using -+ * devm_ioport_map(). -+ */ -+void devm_ioport_unmap(struct device *dev, void __iomem *addr) -+{ -+ ioport_unmap(addr); -+ WARN_ON(devres_destroy(dev, devm_ioport_map_release, -+ devm_ioport_map_match, (void *)addr)); -+} -+EXPORT_SYMBOL(devm_ioport_unmap); -+ -+#ifdef CONFIG_PCI -+/* -+ * PCI iomap devres -+ */ -+#define PCIM_IOMAP_MAX PCI_ROM_RESOURCE -+ -+struct pcim_iomap_devres { -+ void __iomem *table[PCIM_IOMAP_MAX]; -+}; -+ -+static void pcim_iomap_release(struct device *gendev, void *res) -+{ -+ struct pci_dev *dev = container_of(gendev, struct pci_dev, dev); -+ struct pcim_iomap_devres *this = res; -+ int i; -+ -+ for (i = 0; i < PCIM_IOMAP_MAX; i++) -+ if (this->table[i]) -+ pci_iounmap(dev, this->table[i]); -+} -+ -+/** -+ * pcim_iomap_table - access iomap allocation table -+ * @pdev: PCI device to access iomap table for -+ * -+ * Access iomap allocation table for @dev. If iomap table doesn't -+ * exist and @pdev is managed, it will be allocated. All iomaps -+ * recorded in the iomap table are automatically unmapped on driver -+ * detach. -+ * -+ * This function might sleep when the table is first allocated but can -+ * be safely called without context and guaranteed to succed once -+ * allocated. -+ */ -+void __iomem * const * pcim_iomap_table(struct pci_dev *pdev) -+{ -+ struct pcim_iomap_devres *dr, *new_dr; -+ -+ dr = devres_find(&pdev->dev, pcim_iomap_release, NULL, NULL); -+ if (dr) -+ return dr->table; -+ -+ new_dr = devres_alloc(pcim_iomap_release, sizeof(*new_dr), GFP_KERNEL); -+ if (!new_dr) -+ return NULL; -+ dr = devres_get(&pdev->dev, new_dr, NULL, NULL); -+ return dr->table; -+} -+EXPORT_SYMBOL(pcim_iomap_table); -+ -+/** -+ * pcim_iomap - Managed pcim_iomap() -+ * @pdev: PCI device to iomap for -+ * @bar: BAR to iomap -+ * @maxlen: Maximum length of iomap -+ * -+ * Managed pci_iomap(). Map is automatically unmapped on driver -+ * detach. -+ */ -+void __iomem * pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen) -+{ -+ void __iomem **tbl; -+ -+ BUG_ON(bar >= PCIM_IOMAP_MAX); -+ -+ tbl = (void __iomem **)pcim_iomap_table(pdev); -+ if (!tbl || tbl[bar]) /* duplicate mappings not allowed */ -+ return NULL; -+ -+ tbl[bar] = pci_iomap(pdev, bar, maxlen); -+ return tbl[bar]; -+} -+EXPORT_SYMBOL(pcim_iomap); -+ -+/** -+ * pcim_iounmap - Managed pci_iounmap() -+ * @pdev: PCI device to iounmap for -+ * @addr: Address to unmap -+ * -+ * Managed pci_iounmap(). @addr must have been mapped using pcim_iomap(). -+ */ -+void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr) -+{ -+ void __iomem **tbl; -+ int i; -+ -+ pci_iounmap(pdev, addr); -+ -+ tbl = (void __iomem **)pcim_iomap_table(pdev); -+ BUG_ON(!tbl); -+ -+ for (i = 0; i < PCIM_IOMAP_MAX; i++) -+ if (tbl[i] == addr) { -+ tbl[i] = NULL; -+ return; -+ } -+ WARN_ON(1); -+} -+EXPORT_SYMBOL(pcim_iounmap); -+ -+/** -+ * pcim_iomap_regions - Request and iomap PCI BARs -+ * @pdev: PCI device to map IO resources for -+ * @mask: Mask of BARs to request and iomap -+ * @name: Name used when requesting regions -+ * -+ * Request and iomap regions specified by @mask. -+ */ -+int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name) -+{ -+ void __iomem * const *iomap; -+ int i, rc; -+ -+ iomap = pcim_iomap_table(pdev); -+ if (!iomap) -+ return -ENOMEM; -+ -+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { -+ unsigned long len; -+ -+ if (!(mask & (1 << i))) -+ continue; -+ -+ rc = -EINVAL; -+ len = pci_resource_len(pdev, i); -+ if (!len) -+ goto err_inval; -+ -+ rc = pci_request_region(pdev, i, name); -+ if (rc) -+ goto err_inval; -+ -+ rc = -ENOMEM; -+ if (!pcim_iomap(pdev, i, 0)) -+ goto err_region; -+ } -+ -+ return 0; -+ -+ err_region: -+ pci_release_region(pdev, i); -+ err_inval: -+ while (--i >= 0) { -+ if (!(mask & (1 << i))) -+ continue; -+ pcim_iounmap(pdev, iomap[i]); -+ pci_release_region(pdev, i); -+ } -+ -+ return rc; -+} -+EXPORT_SYMBOL(pcim_iomap_regions); -+ -+/** -+ * pcim_iomap_regions_request_all - Request all BARs and iomap specified ones -+ * @pdev: PCI device to map IO resources for -+ * @mask: Mask of BARs to iomap -+ * @name: Name used when requesting regions -+ * -+ * Request all PCI BARs and iomap regions specified by @mask. -+ */ -+int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask, -+ const char *name) -+{ -+ int request_mask = ((1 << 6) - 1) & ~mask; -+ int rc; -+ -+ rc = pci_request_selected_regions(pdev, request_mask, name); -+ if (rc) -+ return rc; -+ -+ rc = pcim_iomap_regions(pdev, mask, name); -+ if (rc) -+ pci_release_selected_regions(pdev, request_mask); -+ return rc; -+} -+EXPORT_SYMBOL(pcim_iomap_regions_request_all); -+ -+/** -+ * pcim_iounmap_regions - Unmap and release PCI BARs -+ * @pdev: PCI device to map IO resources for -+ * @mask: Mask of BARs to unmap and release -+ * -+ * Unamp and release regions specified by @mask. -+ */ -+void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask) -+{ -+ void __iomem * const *iomap; -+ int i; -+ -+ iomap = pcim_iomap_table(pdev); -+ if (!iomap) -+ return; -+ -+ for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { -+ if (!(mask & (1 << i))) -+ continue; -+ -+ pcim_iounmap(pdev, iomap[i]); -+ pci_release_region(pdev, i); -+ } -+} -+EXPORT_SYMBOL(pcim_iounmap_regions); -+#endif -+#endif -diff --git a/libdde-linux26/lib/src/Makefile b/libdde-linux26/lib/src/Makefile -index 358196b..f7a64da 100644 ---- a/libdde-linux26/lib/src/Makefile -+++ b/libdde-linux26/lib/src/Makefile -@@ -103,6 +103,7 @@ SRC_C_libdde-linux26.o.a += \ - lib/crc32.c \ - lib/ctype.c \ - lib/cpumask.c \ -+ lib/devres.c \ - lib/find_next_bit.c \ - lib/hexdump.c \ - lib/idr.c \ diff --git a/debian/patches/libdde_dma_head.patch b/debian/patches/libdde_dma_head.patch deleted file mode 100644 index d3bf0a6c..00000000 --- a/debian/patches/libdde_dma_head.patch +++ /dev/null @@ -1,93 +0,0 @@ -commit 042a53a9e437feaf2230dd2cadcecfae9c7bfe05 -Author: Eric Dumazet <eric.dumazet@gmail.com> -Date: Fri Jun 5 04:04:16 2009 +0000 - - net: skb_shared_info optimization - - skb_dma_unmap() is quite expensive for small packets, - because we use two different cache lines from skb_shared_info. - - One to access nr_frags, one to access dma_maps[0] - - Instead of dma_maps being an array of MAX_SKB_FRAGS + 1 elements, - let dma_head alone in a new dma_head field, close to nr_frags, - to reduce cache lines misses. - - Tested on my dev machine (bnx2 & tg3 adapters), nice speedup ! - - Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> - Signed-off-by: David S. Miller <davem@davemloft.net> - -Index: hurd-debian/libdde-linux26/contrib/include/linux/skbuff.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/skbuff.h 2012-04-16 00:26:40.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/skbuff.h 2012-04-16 00:34:56.000000000 +0000 -@@ -142,6 +142,9 @@ - atomic_t dataref; - unsigned short nr_frags; - unsigned short gso_size; -+#ifdef CONFIG_HAS_DMA -+ dma_addr_t dma_head; -+#endif - /* Warning: this field is not always filled in (UFO)! */ - unsigned short gso_segs; - unsigned short gso_type; -@@ -152,7 +155,7 @@ - struct sk_buff *frag_list; - skb_frag_t frags[MAX_SKB_FRAGS]; - #ifdef CONFIG_HAS_DMA -- dma_addr_t dma_maps[MAX_SKB_FRAGS + 1]; -+ dma_addr_t dma_maps[MAX_SKB_FRAGS]; - #endif - }; - -Index: hurd-debian/libdde-linux26/contrib/net/core/skb_dma_map.c -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/net/core/skb_dma_map.c 2012-04-16 00:26:40.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/net/core/skb_dma_map.c 2012-04-16 00:34:56.000000000 +0000 -@@ -20,7 +20,7 @@ - if (dma_mapping_error(dev, map)) - goto out_err; - -- sp->dma_maps[0] = map; -+ sp->dma_head = map; - for (i = 0; i < sp->nr_frags; i++) { - skb_frag_t *fp = &sp->frags[i]; - -@@ -28,7 +28,7 @@ - fp->size, dir); - if (dma_mapping_error(dev, map)) - goto unwind; -- sp->dma_maps[i + 1] = map; -+ sp->dma_maps[i] = map; - } - sp->num_dma_maps = i + 1; - -@@ -38,10 +38,10 @@ - while (--i >= 0) { - skb_frag_t *fp = &sp->frags[i]; - -- dma_unmap_page(dev, sp->dma_maps[i + 1], -+ dma_unmap_page(dev, sp->dma_maps[i], - fp->size, dir); - } -- dma_unmap_single(dev, sp->dma_maps[0], -+ dma_unmap_single(dev, sp->dma_head, - skb_headlen(skb), dir); - out_err: - return -ENOMEM; -@@ -54,12 +54,12 @@ - struct skb_shared_info *sp = skb_shinfo(skb); - int i; - -- dma_unmap_single(dev, sp->dma_maps[0], -+ dma_unmap_single(dev, sp->dma_head, - skb_headlen(skb), dir); - for (i = 0; i < sp->nr_frags; i++) { - skb_frag_t *fp = &sp->frags[i]; - -- dma_unmap_page(dev, sp->dma_maps[i + 1], -+ dma_unmap_page(dev, sp->dma_maps[i], - fp->size, dir); - } - } diff --git a/debian/patches/libdde_ethoc.patch b/debian/patches/libdde_ethoc.patch deleted file mode 100644 index aff12ad2..00000000 --- a/debian/patches/libdde_ethoc.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- /dev/null 2011-08-03 18:03:30.000000000 +0000 -+++ b/libdde-linux26/contrib/include/net/ethoc.h 2012-04-15 22:19:57.000000000 +0000 -@@ -0,0 +1,22 @@ -+/* -+ * linux/include/net/ethoc.h -+ * -+ * Copyright (C) 2008-2009 Avionic Design GmbH -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * Written by Thierry Reding <thierry.reding@avionic-design.de> -+ */ -+ -+#ifndef LINUX_NET_ETHOC_H -+#define LINUX_NET_ETHOC_H 1 -+ -+struct ethoc_platform_data { -+ u8 hwaddr[IFHWADDRLEN]; -+ s8 phy_id; -+}; -+ -+#endif /* !LINUX_NET_ETHOC_H */ -+ diff --git a/debian/patches/libdde_ethtool.patch b/debian/patches/libdde_ethtool.patch deleted file mode 100644 index d6c232e0..00000000 --- a/debian/patches/libdde_ethtool.patch +++ /dev/null @@ -1,98 +0,0 @@ -diff --git a/libdde-linux26/contrib/include/linux/ethtool.h b/libdde-linux26/contrib/include/linux/ethtool.h -index 27c67a5..45f34dc 100644 ---- a/libdde-linux26/contrib/include/linux/ethtool.h -+++ b/libdde-linux26/contrib/include/linux/ethtool.h -@@ -25,11 +25,14 @@ struct ethtool_cmd { - __u8 phy_address; - __u8 transceiver; /* Which transceiver to use */ - __u8 autoneg; /* Enable or disable autonegotiation */ -+ __u8 mdio_support; - __u32 maxtxpkt; /* Tx pkts before generating tx int */ - __u32 maxrxpkt; /* Rx pkts before generating rx int */ - __u16 speed_hi; -- __u16 reserved2; -- __u32 reserved[3]; -+ __u8 eth_tp_mdix; -+ __u8 reserved2; -+ __u32 lp_advertising; /* Features the link partner advertises */ -+ __u32 reserved[2]; - }; - - static inline void ethtool_cmd_speed_set(struct ethtool_cmd *ep, -@@ -469,6 +472,13 @@ struct ethtool_ops { - #define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */ - #define ETHTOOL_GGRO 0x0000002b /* Get GRO enable (ethtool_value) */ - #define ETHTOOL_SGRO 0x0000002c /* Set GRO enable (ethtool_value) */ -+#define ETHTOOL_GRXRINGS 0x0000002d /* Get RX rings available for LB */ -+#define ETHTOOL_GRXCLSRLCNT 0x0000002e /* Get RX class rule count */ -+#define ETHTOOL_GRXCLSRULE 0x0000002f /* Get RX classification rule */ -+#define ETHTOOL_GRXCLSRLALL 0x00000030 /* Get all RX classification rule */ -+#define ETHTOOL_SRXCLSRLDEL 0x00000031 /* Delete RX classification rule */ -+#define ETHTOOL_SRXCLSRLINS 0x00000032 /* Insert RX classification rule */ -+#define ETHTOOL_FLASHDEV 0x00000033 /* Flash firmware to device */ - - /* compatibility with older code */ - #define SPARC_ETH_GSET ETHTOOL_GSET -@@ -491,6 +501,11 @@ struct ethtool_ops { - #define SUPPORTED_Pause (1 << 13) - #define SUPPORTED_Asym_Pause (1 << 14) - #define SUPPORTED_2500baseX_Full (1 << 15) -+#define SUPPORTED_Backplane (1 << 16) -+#define SUPPORTED_1000baseKX_Full (1 << 17) -+#define SUPPORTED_10000baseKX4_Full (1 << 18) -+#define SUPPORTED_10000baseKR_Full (1 << 19) -+#define SUPPORTED_10000baseR_FEC (1 << 20) - - /* Indicates what features are advertised by the interface. */ - #define ADVERTISED_10baseT_Half (1 << 0) -@@ -509,6 +524,11 @@ struct ethtool_ops { - #define ADVERTISED_Pause (1 << 13) - #define ADVERTISED_Asym_Pause (1 << 14) - #define ADVERTISED_2500baseX_Full (1 << 15) -+#define ADVERTISED_Backplane (1 << 16) -+#define ADVERTISED_1000baseKX_Full (1 << 17) -+#define ADVERTISED_10000baseKX4_Full (1 << 18) -+#define ADVERTISED_10000baseKR_Full (1 << 19) -+#define ADVERTISED_10000baseR_FEC (1 << 20) - - /* The following are all involved in forcing a particular link - * mode for the device for setting things. When getting the -@@ -533,6 +553,7 @@ struct ethtool_ops { - #define PORT_MII 0x02 - #define PORT_FIBRE 0x03 - #define PORT_BNC 0x04 -+#define PORT_OTHER 0xff - - /* Which transceiver to use. */ - #define XCVR_INTERNAL 0x00 -@@ -547,6 +568,11 @@ struct ethtool_ops { - #define AUTONEG_DISABLE 0x00 - #define AUTONEG_ENABLE 0x01 - -+/* Mode MDI or MDI-X */ -+#define ETH_TP_MDI_INVALID 0x00 -+#define ETH_TP_MDI 0x01 -+#define ETH_TP_MDI_X 0x02 -+ - /* Wake-On-Lan options. */ - #define WAKE_PHY (1 << 0) - #define WAKE_UCAST (1 << 1) -@@ -565,6 +591,11 @@ struct ethtool_ops { - #define UDP_V6_FLOW 0x06 - #define SCTP_V6_FLOW 0x07 - #define AH_ESP_V6_FLOW 0x08 -+#define AH_V4_FLOW 0x09 -+#define ESP_V4_FLOW 0x0a -+#define AH_V6_FLOW 0x0b -+#define ESP_V6_FLOW 0x0c -+#define IP_USER_FLOW 0x0d - - /* L3-L4 network traffic flow hash options */ - #define RXH_DEV_PORT (1 << 0) -@@ -577,5 +608,6 @@ struct ethtool_ops { - #define RXH_L4_B_2_3 (1 << 7) /* dst port in case of TCP/UDP/SCTP */ - #define RXH_DISCARD (1 << 31) - -+#define RX_CLS_FLOW_DISC 0xffffffffffffffffULL - - #endif /* _LINUX_ETHTOOL_H */ diff --git a/debian/patches/libdde_group_addr.patch b/debian/patches/libdde_group_addr.patch deleted file mode 100644 index dee2723a..00000000 --- a/debian/patches/libdde_group_addr.patch +++ /dev/null @@ -1,429 +0,0 @@ -commit 31278e71471399beaff9280737e52b47db4dc345 -Author: Jiri Pirko <jpirko@redhat.com> -Date: Wed Jun 17 01:12:19 2009 +0000 - - net: group address list and its count - - This patch is inspired by patch recently posted by Johannes Berg. Basically what - my patch does is to group list and a count of addresses into newly introduced - structure netdev_hw_addr_list. This brings us two benefits: - 1) struct net_device becames a bit nicer. - 2) in the future there will be a possibility to operate with lists independently - on netdevices (with exporting right functions). - I wanted to introduce this patch before I'll post a multicast lists conversion. - - Signed-off-by: Jiri Pirko <jpirko@redhat.com> - - drivers/net/bnx2.c | 4 +- - drivers/net/e1000/e1000_main.c | 4 +- - drivers/net/ixgbe/ixgbe_main.c | 6 +- - drivers/net/mv643xx_eth.c | 2 +- - drivers/net/niu.c | 4 +- - drivers/net/virtio_net.c | 10 ++-- - drivers/s390/net/qeth_l2_main.c | 2 +- - include/linux/netdevice.h | 17 +++-- - net/core/dev.c | 130 ++++++++++++++++++-------------------- - 9 files changed, 89 insertions(+), 90 deletions(-) - Signed-off-by: David S. Miller <davem@davemloft.net> - -Index: hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:34:46.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:34:51.000000000 +0000 -@@ -224,6 +224,11 @@ - struct rcu_head rcu_head; - }; - -+struct netdev_hw_addr_list { -+ struct list_head list; -+ int count; -+}; -+ - struct hh_cache - { - struct hh_cache *hh_next; /* Next entry */ -@@ -741,9 +746,8 @@ - unsigned char addr_len; /* hardware address length */ - unsigned short dev_id; /* for shared network cards */ - -- struct list_head uc_list; /* Secondary unicast mac -- addresses */ -- int uc_count; /* Number of installed ucasts */ -+ struct netdev_hw_addr_list uc; /* Secondary unicast -+ mac addresses */ - int uc_promisc; - spinlock_t addr_list_lock; - struct dev_addr_list *mc_list; /* Multicast mac addresses */ -@@ -775,7 +779,8 @@ - because most packets are - unicast) */ - -- struct list_head dev_addr_list; /* list of device hw addresses */ -+ struct netdev_hw_addr_list dev_addrs; /* list of device -+ hw addresses */ - - unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ - -@@ -1786,11 +1791,11 @@ - } - - /* -- * dev_addr_list walker. Should be used only for read access. Call with -+ * dev_addrs walker. Should be used only for read access. Call with - * rcu_read_lock held. - */ - #define for_each_dev_addr(dev, ha) \ -- list_for_each_entry_rcu(ha, &dev->dev_addr_list, list) -+ list_for_each_entry_rcu(ha, &dev->dev_addrs.list, list) - - /* These functions live elsewhere (drivers/net/net_init.c, but related) */ - -Index: hurd-debian/libdde-linux26/lib/src/net/core/dev.c -=================================================================== ---- hurd-debian.orig/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:34:49.000000000 +0000 -+++ hurd-debian/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:34:51.000000000 +0000 -@@ -3377,10 +3377,10 @@ - /* Unicast addresses changes may only happen under the rtnl, - * therefore calling __dev_set_promiscuity here is safe. - */ -- if (dev->uc_count > 0 && !dev->uc_promisc) { -+ if (dev->uc.count > 0 && !dev->uc_promisc) { - __dev_set_promiscuity(dev, 1); - dev->uc_promisc = 1; -- } else if (dev->uc_count == 0 && dev->uc_promisc) { -+ } else if (dev->uc.count == 0 && dev->uc_promisc) { - __dev_set_promiscuity(dev, -1); - dev->uc_promisc = 0; - } -@@ -3399,9 +3399,8 @@ - - /* hw addresses list handling functions */ - --static int __hw_addr_add(struct list_head *list, int *delta, -- unsigned char *addr, int addr_len, -- unsigned char addr_type) -+static int __hw_addr_add(struct netdev_hw_addr_list *list, unsigned char *addr, -+ int addr_len, unsigned char addr_type) - { - struct netdev_hw_addr *ha; - int alloc_size; -@@ -3409,7 +3408,7 @@ - if (addr_len > MAX_ADDR_LEN) - return -EINVAL; - -- list_for_each_entry(ha, list, list) { -+ list_for_each_entry(ha, &list->list, list) { - if (!memcmp(ha->addr, addr, addr_len) && - ha->type == addr_type) { - ha->refcount++; -@@ -3428,9 +3427,8 @@ - ha->type = addr_type; - ha->refcount = 1; - ha->synced = false; -- list_add_tail_rcu(&ha->list, list); -- if (delta) -- (*delta)++; -+ list_add_tail_rcu(&ha->list, &list->list); -+ list->count++; - return 0; - } - -@@ -3442,120 +3440,121 @@ - kfree(ha); - } - --static int __hw_addr_del(struct list_head *list, int *delta, -- unsigned char *addr, int addr_len, -- unsigned char addr_type) -+static int __hw_addr_del(struct netdev_hw_addr_list *list, unsigned char *addr, -+ int addr_len, unsigned char addr_type) - { - struct netdev_hw_addr *ha; - -- list_for_each_entry(ha, list, list) { -+ list_for_each_entry(ha, &list->list, list) { - if (!memcmp(ha->addr, addr, addr_len) && - (ha->type == addr_type || !addr_type)) { - if (--ha->refcount) - return 0; - list_del_rcu(&ha->list); - call_rcu(&ha->rcu_head, ha_rcu_free); -- if (delta) -- (*delta)--; -+ list->count--; - return 0; - } - } - return -ENOENT; - } - --static int __hw_addr_add_multiple(struct list_head *to_list, int *to_delta, -- struct list_head *from_list, int addr_len, -+static int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list, -+ struct netdev_hw_addr_list *from_list, -+ int addr_len, - unsigned char addr_type) - { - int err; - struct netdev_hw_addr *ha, *ha2; - unsigned char type; - -- list_for_each_entry(ha, from_list, list) { -+ list_for_each_entry(ha, &from_list->list, list) { - type = addr_type ? addr_type : ha->type; -- err = __hw_addr_add(to_list, to_delta, ha->addr, -- addr_len, type); -+ err = __hw_addr_add(to_list, ha->addr, addr_len, type); - if (err) - goto unroll; - } - return 0; - - unroll: -- list_for_each_entry(ha2, from_list, list) { -+ list_for_each_entry(ha2, &from_list->list, list) { - if (ha2 == ha) - break; - type = addr_type ? addr_type : ha2->type; -- __hw_addr_del(to_list, to_delta, ha2->addr, -- addr_len, type); -+ __hw_addr_del(to_list, ha2->addr, addr_len, type); - } - return err; - } - --static void __hw_addr_del_multiple(struct list_head *to_list, int *to_delta, -- struct list_head *from_list, int addr_len, -+static void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list, -+ struct netdev_hw_addr_list *from_list, -+ int addr_len, - unsigned char addr_type) - { - struct netdev_hw_addr *ha; - unsigned char type; - -- list_for_each_entry(ha, from_list, list) { -+ list_for_each_entry(ha, &from_list->list, list) { - type = addr_type ? addr_type : ha->type; -- __hw_addr_del(to_list, to_delta, ha->addr, -- addr_len, addr_type); -+ __hw_addr_del(to_list, ha->addr, addr_len, addr_type); - } - } - --static int __hw_addr_sync(struct list_head *to_list, int *to_delta, -- struct list_head *from_list, int *from_delta, -+static int __hw_addr_sync(struct netdev_hw_addr_list *to_list, -+ struct netdev_hw_addr_list *from_list, - int addr_len) - { - int err = 0; - struct netdev_hw_addr *ha, *tmp; - -- list_for_each_entry_safe(ha, tmp, from_list, list) { -+ list_for_each_entry_safe(ha, tmp, &from_list->list, list) { - if (!ha->synced) { -- err = __hw_addr_add(to_list, to_delta, ha->addr, -+ err = __hw_addr_add(to_list, ha->addr, - addr_len, ha->type); - if (err) - break; - ha->synced = true; - ha->refcount++; - } else if (ha->refcount == 1) { -- __hw_addr_del(to_list, to_delta, ha->addr, -- addr_len, ha->type); -- __hw_addr_del(from_list, from_delta, ha->addr, -- addr_len, ha->type); -+ __hw_addr_del(to_list, ha->addr, addr_len, ha->type); -+ __hw_addr_del(from_list, ha->addr, addr_len, ha->type); - } - } - return err; - } - --static void __hw_addr_unsync(struct list_head *to_list, int *to_delta, -- struct list_head *from_list, int *from_delta, -+static void __hw_addr_unsync(struct netdev_hw_addr_list *to_list, -+ struct netdev_hw_addr_list *from_list, - int addr_len) - { - struct netdev_hw_addr *ha, *tmp; - -- list_for_each_entry_safe(ha, tmp, from_list, list) { -+ list_for_each_entry_safe(ha, tmp, &from_list->list, list) { - if (ha->synced) { -- __hw_addr_del(to_list, to_delta, ha->addr, -+ __hw_addr_del(to_list, ha->addr, - addr_len, ha->type); - ha->synced = false; -- __hw_addr_del(from_list, from_delta, ha->addr, -+ __hw_addr_del(from_list, ha->addr, - addr_len, ha->type); - } - } - } - -- --static void __hw_addr_flush(struct list_head *list) -+static void __hw_addr_flush(struct netdev_hw_addr_list *list) - { - struct netdev_hw_addr *ha, *tmp; - -- list_for_each_entry_safe(ha, tmp, list, list) { -+ list_for_each_entry_safe(ha, tmp, &list->list, list) { - list_del_rcu(&ha->list); - call_rcu(&ha->rcu_head, ha_rcu_free); - } -+ list->count = 0; -+} -+ -+static void __hw_addr_init(struct netdev_hw_addr_list *list) -+{ -+ INIT_LIST_HEAD(&list->list); -+ list->count = 0; - } - - /* Device addresses handling functions */ -@@ -3564,7 +3563,7 @@ - { - /* rtnl_mutex must be held here */ - -- __hw_addr_flush(&dev->dev_addr_list); -+ __hw_addr_flush(&dev->dev_addrs); - dev->dev_addr = NULL; - } - -@@ -3576,16 +3575,16 @@ - - /* rtnl_mutex must be held here */ - -- INIT_LIST_HEAD(&dev->dev_addr_list); -+ __hw_addr_init(&dev->dev_addrs); - memset(addr, 0, sizeof(addr)); -- err = __hw_addr_add(&dev->dev_addr_list, NULL, addr, sizeof(addr), -+ err = __hw_addr_add(&dev->dev_addrs, addr, sizeof(addr), - NETDEV_HW_ADDR_T_LAN); - if (!err) { - /* - * Get the first (previously created) address from the list - * and set dev_addr pointer to this location. - */ -- ha = list_first_entry(&dev->dev_addr_list, -+ ha = list_first_entry(&dev->dev_addrs.list, - struct netdev_hw_addr, list); - dev->dev_addr = ha->addr; - } -@@ -3610,8 +3609,7 @@ - - ASSERT_RTNL(); - -- err = __hw_addr_add(&dev->dev_addr_list, NULL, addr, dev->addr_len, -- addr_type); -+ err = __hw_addr_add(&dev->dev_addrs, addr, dev->addr_len, addr_type); - if (!err) - call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); - return err; -@@ -3641,11 +3639,12 @@ - * We can not remove the first address from the list because - * dev->dev_addr points to that. - */ -- ha = list_first_entry(&dev->dev_addr_list, struct netdev_hw_addr, list); -+ ha = list_first_entry(&dev->dev_addrs.list, -+ struct netdev_hw_addr, list); - if (ha->addr == dev->dev_addr && ha->refcount == 1) - return -ENOENT; - -- err = __hw_addr_del(&dev->dev_addr_list, NULL, addr, dev->addr_len, -+ err = __hw_addr_del(&dev->dev_addrs, addr, dev->addr_len, - addr_type); - if (!err) - call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); -@@ -3673,8 +3672,7 @@ - - if (from_dev->addr_len != to_dev->addr_len) - return -EINVAL; -- err = __hw_addr_add_multiple(&to_dev->dev_addr_list, NULL, -- &from_dev->dev_addr_list, -+ err = __hw_addr_add_multiple(&to_dev->dev_addrs, &from_dev->dev_addrs, - to_dev->addr_len, addr_type); - if (!err) - call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); -@@ -3700,15 +3698,14 @@ - - if (from_dev->addr_len != to_dev->addr_len) - return -EINVAL; -- __hw_addr_del_multiple(&to_dev->dev_addr_list, NULL, -- &from_dev->dev_addr_list, -+ __hw_addr_del_multiple(&to_dev->dev_addrs, &from_dev->dev_addrs, - to_dev->addr_len, addr_type); - call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); - return 0; - } - EXPORT_SYMBOL(dev_addr_del_multiple); - --/* unicast and multicast addresses handling functions */ -+/* multicast addresses handling functions */ - - int __dev_addr_delete(struct dev_addr_list **list, int *count, - void *addr, int alen, int glbl) -@@ -3784,8 +3781,8 @@ - - ASSERT_RTNL(); - -- err = __hw_addr_del(&dev->uc_list, &dev->uc_count, addr, -- dev->addr_len, NETDEV_HW_ADDR_T_UNICAST); -+ err = __hw_addr_del(&dev->uc, addr, dev->addr_len, -+ NETDEV_HW_ADDR_T_UNICAST); - if (!err) - __dev_set_rx_mode(dev); - return err; -@@ -3808,8 +3805,8 @@ - - ASSERT_RTNL(); - -- err = __hw_addr_add(&dev->uc_list, &dev->uc_count, addr, -- dev->addr_len, NETDEV_HW_ADDR_T_UNICAST); -+ err = __hw_addr_add(&dev->uc, addr, dev->addr_len, -+ NETDEV_HW_ADDR_T_UNICAST); - if (!err) - __dev_set_rx_mode(dev); - return err; -@@ -3882,8 +3879,7 @@ - if (to->addr_len != from->addr_len) - return -EINVAL; - -- err = __hw_addr_sync(&to->uc_list, &to->uc_count, -- &from->uc_list, &from->uc_count, to->addr_len); -+ err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len); - if (!err) - __dev_set_rx_mode(to); - return err; -@@ -3906,8 +3902,7 @@ - if (to->addr_len != from->addr_len) - return; - -- __hw_addr_unsync(&to->uc_list, &to->uc_count, -- &from->uc_list, &from->uc_count, to->addr_len); -+ __hw_addr_unsync(&to->uc, &from->uc, to->addr_len); - __dev_set_rx_mode(to); - } - EXPORT_SYMBOL(dev_unicast_unsync); -@@ -3916,15 +3911,14 @@ - { - /* rtnl_mutex must be held here */ - -- __hw_addr_flush(&dev->uc_list); -- dev->uc_count = 0; -+ __hw_addr_flush(&dev->uc); - } - - static void dev_unicast_init(struct net_device *dev) - { - /* rtnl_mutex must be held here */ - -- INIT_LIST_HEAD(&dev->uc_list); -+ __hw_addr_init(&dev->uc); - } - - diff --git a/debian/patches/libdde_mdio.patch b/debian/patches/libdde_mdio.patch deleted file mode 100644 index cf00e47a..00000000 --- a/debian/patches/libdde_mdio.patch +++ /dev/null @@ -1,359 +0,0 @@ ---- /dev/null 2011-08-03 18:03:30.000000000 +0000 -+++ b/libdde-linux26/contrib/include/linux/mdio.h 2012-04-15 22:16:31.000000000 +0000 -@@ -0,0 +1,356 @@ -+/* -+ * linux/mdio.h: definitions for MDIO (clause 45) transceivers -+ * Copyright 2006-2009 Solarflare Communications Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify it -+ * under the terms of the GNU General Public License version 2 as published -+ * by the Free Software Foundation, incorporated herein by reference. -+ */ -+ -+#ifndef __LINUX_MDIO_H__ -+#define __LINUX_MDIO_H__ -+ -+#include <linux/mii.h> -+ -+/* MDIO Manageable Devices (MMDs). */ -+#define MDIO_MMD_PMAPMD 1 /* Physical Medium Attachment/ -+ * Physical Medium Dependent */ -+#define MDIO_MMD_WIS 2 /* WAN Interface Sublayer */ -+#define MDIO_MMD_PCS 3 /* Physical Coding Sublayer */ -+#define MDIO_MMD_PHYXS 4 /* PHY Extender Sublayer */ -+#define MDIO_MMD_DTEXS 5 /* DTE Extender Sublayer */ -+#define MDIO_MMD_TC 6 /* Transmission Convergence */ -+#define MDIO_MMD_AN 7 /* Auto-Negotiation */ -+#define MDIO_MMD_C22EXT 29 /* Clause 22 extension */ -+#define MDIO_MMD_VEND1 30 /* Vendor specific 1 */ -+#define MDIO_MMD_VEND2 31 /* Vendor specific 2 */ -+ -+/* Generic MDIO registers. */ -+#define MDIO_CTRL1 MII_BMCR -+#define MDIO_STAT1 MII_BMSR -+#define MDIO_DEVID1 MII_PHYSID1 -+#define MDIO_DEVID2 MII_PHYSID2 -+#define MDIO_SPEED 4 /* Speed ability */ -+#define MDIO_DEVS1 5 /* Devices in package */ -+#define MDIO_DEVS2 6 -+#define MDIO_CTRL2 7 /* 10G control 2 */ -+#define MDIO_STAT2 8 /* 10G status 2 */ -+#define MDIO_PMA_TXDIS 9 /* 10G PMA/PMD transmit disable */ -+#define MDIO_PMA_RXDET 10 /* 10G PMA/PMD receive signal detect */ -+#define MDIO_PMA_EXTABLE 11 /* 10G PMA/PMD extended ability */ -+#define MDIO_PKGID1 14 /* Package identifier */ -+#define MDIO_PKGID2 15 -+#define MDIO_AN_ADVERTISE 16 /* AN advertising (base page) */ -+#define MDIO_AN_LPA 19 /* AN LP abilities (base page) */ -+#define MDIO_PHYXS_LNSTAT 24 /* PHY XGXS lane state */ -+ -+/* Media-dependent registers. */ -+#define MDIO_PMA_10GBT_SWAPPOL 130 /* 10GBASE-T pair swap & polarity */ -+#define MDIO_PMA_10GBT_TXPWR 131 /* 10GBASE-T TX power control */ -+#define MDIO_PMA_10GBT_SNR 133 /* 10GBASE-T SNR margin, lane A. -+ * Lanes B-D are numbered 134-136. */ -+#define MDIO_PMA_10GBR_FECABLE 170 /* 10GBASE-R FEC ability */ -+#define MDIO_PCS_10GBX_STAT1 24 /* 10GBASE-X PCS status 1 */ -+#define MDIO_PCS_10GBRT_STAT1 32 /* 10GBASE-R/-T PCS status 1 */ -+#define MDIO_PCS_10GBRT_STAT2 33 /* 10GBASE-R/-T PCS status 2 */ -+#define MDIO_AN_10GBT_CTRL 32 /* 10GBASE-T auto-negotiation control */ -+#define MDIO_AN_10GBT_STAT 33 /* 10GBASE-T auto-negotiation status */ -+ -+/* LASI (Link Alarm Status Interrupt) registers, defined by XENPAK MSA. */ -+#define MDIO_PMA_LASI_RXCTRL 0x9000 /* RX_ALARM control */ -+#define MDIO_PMA_LASI_TXCTRL 0x9001 /* TX_ALARM control */ -+#define MDIO_PMA_LASI_CTRL 0x9002 /* LASI control */ -+#define MDIO_PMA_LASI_RXSTAT 0x9003 /* RX_ALARM status */ -+#define MDIO_PMA_LASI_TXSTAT 0x9004 /* TX_ALARM status */ -+#define MDIO_PMA_LASI_STAT 0x9005 /* LASI status */ -+ -+/* Control register 1. */ -+/* Enable extended speed selection */ -+#define MDIO_CTRL1_SPEEDSELEXT (BMCR_SPEED1000 | BMCR_SPEED100) -+/* All speed selection bits */ -+#define MDIO_CTRL1_SPEEDSEL (MDIO_CTRL1_SPEEDSELEXT | 0x003c) -+#define MDIO_CTRL1_FULLDPLX BMCR_FULLDPLX -+#define MDIO_CTRL1_LPOWER BMCR_PDOWN -+#define MDIO_CTRL1_RESET BMCR_RESET -+#define MDIO_PMA_CTRL1_LOOPBACK 0x0001 -+#define MDIO_PMA_CTRL1_SPEED1000 BMCR_SPEED1000 -+#define MDIO_PMA_CTRL1_SPEED100 BMCR_SPEED100 -+#define MDIO_PCS_CTRL1_LOOPBACK BMCR_LOOPBACK -+#define MDIO_PHYXS_CTRL1_LOOPBACK BMCR_LOOPBACK -+#define MDIO_AN_CTRL1_RESTART BMCR_ANRESTART -+#define MDIO_AN_CTRL1_ENABLE BMCR_ANENABLE -+#define MDIO_AN_CTRL1_XNP 0x2000 /* Enable extended next page */ -+ -+/* 10 Gb/s */ -+#define MDIO_CTRL1_SPEED10G (MDIO_CTRL1_SPEEDSELEXT | 0x00) -+/* 10PASS-TS/2BASE-TL */ -+#define MDIO_CTRL1_SPEED10P2B (MDIO_CTRL1_SPEEDSELEXT | 0x04) -+ -+/* Status register 1. */ -+#define MDIO_STAT1_LPOWERABLE 0x0002 /* Low-power ability */ -+#define MDIO_STAT1_LSTATUS BMSR_LSTATUS -+#define MDIO_STAT1_FAULT 0x0080 /* Fault */ -+#define MDIO_AN_STAT1_LPABLE 0x0001 /* Link partner AN ability */ -+#define MDIO_AN_STAT1_ABLE BMSR_ANEGCAPABLE -+#define MDIO_AN_STAT1_RFAULT BMSR_RFAULT -+#define MDIO_AN_STAT1_COMPLETE BMSR_ANEGCOMPLETE -+#define MDIO_AN_STAT1_PAGE 0x0040 /* Page received */ -+#define MDIO_AN_STAT1_XNP 0x0080 /* Extended next page status */ -+ -+/* Speed register. */ -+#define MDIO_SPEED_10G 0x0001 /* 10G capable */ -+#define MDIO_PMA_SPEED_2B 0x0002 /* 2BASE-TL capable */ -+#define MDIO_PMA_SPEED_10P 0x0004 /* 10PASS-TS capable */ -+#define MDIO_PMA_SPEED_1000 0x0010 /* 1000M capable */ -+#define MDIO_PMA_SPEED_100 0x0020 /* 100M capable */ -+#define MDIO_PMA_SPEED_10 0x0040 /* 10M capable */ -+#define MDIO_PCS_SPEED_10P2B 0x0002 /* 10PASS-TS/2BASE-TL capable */ -+ -+/* Device present registers. */ -+#define MDIO_DEVS_PRESENT(devad) (1 << (devad)) -+#define MDIO_DEVS_PMAPMD MDIO_DEVS_PRESENT(MDIO_MMD_PMAPMD) -+#define MDIO_DEVS_WIS MDIO_DEVS_PRESENT(MDIO_MMD_WIS) -+#define MDIO_DEVS_PCS MDIO_DEVS_PRESENT(MDIO_MMD_PCS) -+#define MDIO_DEVS_PHYXS MDIO_DEVS_PRESENT(MDIO_MMD_PHYXS) -+#define MDIO_DEVS_DTEXS MDIO_DEVS_PRESENT(MDIO_MMD_DTEXS) -+#define MDIO_DEVS_TC MDIO_DEVS_PRESENT(MDIO_MMD_TC) -+#define MDIO_DEVS_AN MDIO_DEVS_PRESENT(MDIO_MMD_AN) -+#define MDIO_DEVS_C22EXT MDIO_DEVS_PRESENT(MDIO_MMD_C22EXT) -+ -+/* Control register 2. */ -+#define MDIO_PMA_CTRL2_TYPE 0x000f /* PMA/PMD type selection */ -+#define MDIO_PMA_CTRL2_10GBCX4 0x0000 /* 10GBASE-CX4 type */ -+#define MDIO_PMA_CTRL2_10GBEW 0x0001 /* 10GBASE-EW type */ -+#define MDIO_PMA_CTRL2_10GBLW 0x0002 /* 10GBASE-LW type */ -+#define MDIO_PMA_CTRL2_10GBSW 0x0003 /* 10GBASE-SW type */ -+#define MDIO_PMA_CTRL2_10GBLX4 0x0004 /* 10GBASE-LX4 type */ -+#define MDIO_PMA_CTRL2_10GBER 0x0005 /* 10GBASE-ER type */ -+#define MDIO_PMA_CTRL2_10GBLR 0x0006 /* 10GBASE-LR type */ -+#define MDIO_PMA_CTRL2_10GBSR 0x0007 /* 10GBASE-SR type */ -+#define MDIO_PMA_CTRL2_10GBLRM 0x0008 /* 10GBASE-LRM type */ -+#define MDIO_PMA_CTRL2_10GBT 0x0009 /* 10GBASE-T type */ -+#define MDIO_PMA_CTRL2_10GBKX4 0x000a /* 10GBASE-KX4 type */ -+#define MDIO_PMA_CTRL2_10GBKR 0x000b /* 10GBASE-KR type */ -+#define MDIO_PMA_CTRL2_1000BT 0x000c /* 1000BASE-T type */ -+#define MDIO_PMA_CTRL2_1000BKX 0x000d /* 1000BASE-KX type */ -+#define MDIO_PMA_CTRL2_100BTX 0x000e /* 100BASE-TX type */ -+#define MDIO_PMA_CTRL2_10BT 0x000f /* 10BASE-T type */ -+#define MDIO_PCS_CTRL2_TYPE 0x0003 /* PCS type selection */ -+#define MDIO_PCS_CTRL2_10GBR 0x0000 /* 10GBASE-R type */ -+#define MDIO_PCS_CTRL2_10GBX 0x0001 /* 10GBASE-X type */ -+#define MDIO_PCS_CTRL2_10GBW 0x0002 /* 10GBASE-W type */ -+#define MDIO_PCS_CTRL2_10GBT 0x0003 /* 10GBASE-T type */ -+ -+/* Status register 2. */ -+#define MDIO_STAT2_RXFAULT 0x0400 /* Receive fault */ -+#define MDIO_STAT2_TXFAULT 0x0800 /* Transmit fault */ -+#define MDIO_STAT2_DEVPRST 0xc000 /* Device present */ -+#define MDIO_STAT2_DEVPRST_VAL 0x8000 /* Device present value */ -+#define MDIO_PMA_STAT2_LBABLE 0x0001 /* PMA loopback ability */ -+#define MDIO_PMA_STAT2_10GBEW 0x0002 /* 10GBASE-EW ability */ -+#define MDIO_PMA_STAT2_10GBLW 0x0004 /* 10GBASE-LW ability */ -+#define MDIO_PMA_STAT2_10GBSW 0x0008 /* 10GBASE-SW ability */ -+#define MDIO_PMA_STAT2_10GBLX4 0x0010 /* 10GBASE-LX4 ability */ -+#define MDIO_PMA_STAT2_10GBER 0x0020 /* 10GBASE-ER ability */ -+#define MDIO_PMA_STAT2_10GBLR 0x0040 /* 10GBASE-LR ability */ -+#define MDIO_PMA_STAT2_10GBSR 0x0080 /* 10GBASE-SR ability */ -+#define MDIO_PMD_STAT2_TXDISAB 0x0100 /* PMD TX disable ability */ -+#define MDIO_PMA_STAT2_EXTABLE 0x0200 /* Extended abilities */ -+#define MDIO_PMA_STAT2_RXFLTABLE 0x1000 /* Receive fault ability */ -+#define MDIO_PMA_STAT2_TXFLTABLE 0x2000 /* Transmit fault ability */ -+#define MDIO_PCS_STAT2_10GBR 0x0001 /* 10GBASE-R capable */ -+#define MDIO_PCS_STAT2_10GBX 0x0002 /* 10GBASE-X capable */ -+#define MDIO_PCS_STAT2_10GBW 0x0004 /* 10GBASE-W capable */ -+#define MDIO_PCS_STAT2_RXFLTABLE 0x1000 /* Receive fault ability */ -+#define MDIO_PCS_STAT2_TXFLTABLE 0x2000 /* Transmit fault ability */ -+ -+/* Transmit disable register. */ -+#define MDIO_PMD_TXDIS_GLOBAL 0x0001 /* Global PMD TX disable */ -+#define MDIO_PMD_TXDIS_0 0x0002 /* PMD TX disable 0 */ -+#define MDIO_PMD_TXDIS_1 0x0004 /* PMD TX disable 1 */ -+#define MDIO_PMD_TXDIS_2 0x0008 /* PMD TX disable 2 */ -+#define MDIO_PMD_TXDIS_3 0x0010 /* PMD TX disable 3 */ -+ -+/* Receive signal detect register. */ -+#define MDIO_PMD_RXDET_GLOBAL 0x0001 /* Global PMD RX signal detect */ -+#define MDIO_PMD_RXDET_0 0x0002 /* PMD RX signal detect 0 */ -+#define MDIO_PMD_RXDET_1 0x0004 /* PMD RX signal detect 1 */ -+#define MDIO_PMD_RXDET_2 0x0008 /* PMD RX signal detect 2 */ -+#define MDIO_PMD_RXDET_3 0x0010 /* PMD RX signal detect 3 */ -+ -+/* Extended abilities register. */ -+#define MDIO_PMA_EXTABLE_10GCX4 0x0001 /* 10GBASE-CX4 ability */ -+#define MDIO_PMA_EXTABLE_10GBLRM 0x0002 /* 10GBASE-LRM ability */ -+#define MDIO_PMA_EXTABLE_10GBT 0x0004 /* 10GBASE-T ability */ -+#define MDIO_PMA_EXTABLE_10GBKX4 0x0008 /* 10GBASE-KX4 ability */ -+#define MDIO_PMA_EXTABLE_10GBKR 0x0010 /* 10GBASE-KR ability */ -+#define MDIO_PMA_EXTABLE_1000BT 0x0020 /* 1000BASE-T ability */ -+#define MDIO_PMA_EXTABLE_1000BKX 0x0040 /* 1000BASE-KX ability */ -+#define MDIO_PMA_EXTABLE_100BTX 0x0080 /* 100BASE-TX ability */ -+#define MDIO_PMA_EXTABLE_10BT 0x0100 /* 10BASE-T ability */ -+ -+/* PHY XGXS lane state register. */ -+#define MDIO_PHYXS_LNSTAT_SYNC0 0x0001 -+#define MDIO_PHYXS_LNSTAT_SYNC1 0x0002 -+#define MDIO_PHYXS_LNSTAT_SYNC2 0x0004 -+#define MDIO_PHYXS_LNSTAT_SYNC3 0x0008 -+#define MDIO_PHYXS_LNSTAT_ALIGN 0x1000 -+ -+/* PMA 10GBASE-T pair swap & polarity */ -+#define MDIO_PMA_10GBT_SWAPPOL_ABNX 0x0001 /* Pair A/B uncrossed */ -+#define MDIO_PMA_10GBT_SWAPPOL_CDNX 0x0002 /* Pair C/D uncrossed */ -+#define MDIO_PMA_10GBT_SWAPPOL_AREV 0x0100 /* Pair A polarity reversed */ -+#define MDIO_PMA_10GBT_SWAPPOL_BREV 0x0200 /* Pair B polarity reversed */ -+#define MDIO_PMA_10GBT_SWAPPOL_CREV 0x0400 /* Pair C polarity reversed */ -+#define MDIO_PMA_10GBT_SWAPPOL_DREV 0x0800 /* Pair D polarity reversed */ -+ -+/* PMA 10GBASE-T TX power register. */ -+#define MDIO_PMA_10GBT_TXPWR_SHORT 0x0001 /* Short-reach mode */ -+ -+/* PMA 10GBASE-T SNR registers. */ -+/* Value is SNR margin in dB, clamped to range [-127, 127], plus 0x8000. */ -+#define MDIO_PMA_10GBT_SNR_BIAS 0x8000 -+#define MDIO_PMA_10GBT_SNR_MAX 127 -+ -+/* PMA 10GBASE-R FEC ability register. */ -+#define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001 /* FEC ability */ -+#define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002 /* FEC error indic. ability */ -+ -+/* PCS 10GBASE-R/-T status register 1. */ -+#define MDIO_PCS_10GBRT_STAT1_BLKLK 0x0001 /* Block lock attained */ -+ -+/* PCS 10GBASE-R/-T status register 2. */ -+#define MDIO_PCS_10GBRT_STAT2_ERR 0x00ff -+#define MDIO_PCS_10GBRT_STAT2_BER 0x3f00 -+ -+/* AN 10GBASE-T control register. */ -+#define MDIO_AN_10GBT_CTRL_ADV10G 0x1000 /* Advertise 10GBASE-T */ -+ -+/* AN 10GBASE-T status register. */ -+#define MDIO_AN_10GBT_STAT_LPTRR 0x0200 /* LP training reset req. */ -+#define MDIO_AN_10GBT_STAT_LPLTABLE 0x0400 /* LP loop timing ability */ -+#define MDIO_AN_10GBT_STAT_LP10G 0x0800 /* LP is 10GBT capable */ -+#define MDIO_AN_10GBT_STAT_REMOK 0x1000 /* Remote OK */ -+#define MDIO_AN_10GBT_STAT_LOCOK 0x2000 /* Local OK */ -+#define MDIO_AN_10GBT_STAT_MS 0x4000 /* Master/slave config */ -+#define MDIO_AN_10GBT_STAT_MSFLT 0x8000 /* Master/slave config fault */ -+ -+/* LASI RX_ALARM control/status registers. */ -+#define MDIO_PMA_LASI_RX_PHYXSLFLT 0x0001 /* PHY XS RX local fault */ -+#define MDIO_PMA_LASI_RX_PCSLFLT 0x0008 /* PCS RX local fault */ -+#define MDIO_PMA_LASI_RX_PMALFLT 0x0010 /* PMA/PMD RX local fault */ -+#define MDIO_PMA_LASI_RX_OPTICPOWERFLT 0x0020 /* RX optical power fault */ -+#define MDIO_PMA_LASI_RX_WISLFLT 0x0200 /* WIS local fault */ -+ -+/* LASI TX_ALARM control/status registers. */ -+#define MDIO_PMA_LASI_TX_PHYXSLFLT 0x0001 /* PHY XS TX local fault */ -+#define MDIO_PMA_LASI_TX_PCSLFLT 0x0008 /* PCS TX local fault */ -+#define MDIO_PMA_LASI_TX_PMALFLT 0x0010 /* PMA/PMD TX local fault */ -+#define MDIO_PMA_LASI_TX_LASERPOWERFLT 0x0080 /* Laser output power fault */ -+#define MDIO_PMA_LASI_TX_LASERTEMPFLT 0x0100 /* Laser temperature fault */ -+#define MDIO_PMA_LASI_TX_LASERBICURRFLT 0x0200 /* Laser bias current fault */ -+ -+/* LASI control/status registers. */ -+#define MDIO_PMA_LASI_LSALARM 0x0001 /* LS_ALARM enable/status */ -+#define MDIO_PMA_LASI_TXALARM 0x0002 /* TX_ALARM enable/status */ -+#define MDIO_PMA_LASI_RXALARM 0x0004 /* RX_ALARM enable/status */ -+ -+/* Mapping between MDIO PRTAD/DEVAD and mii_ioctl_data::phy_id */ -+ -+#define MDIO_PHY_ID_C45 0x8000 -+#define MDIO_PHY_ID_PRTAD 0x03e0 -+#define MDIO_PHY_ID_DEVAD 0x001f -+#define MDIO_PHY_ID_C45_MASK \ -+ (MDIO_PHY_ID_C45 | MDIO_PHY_ID_PRTAD | MDIO_PHY_ID_DEVAD) -+ -+static inline __u16 mdio_phy_id_c45(int prtad, int devad) -+{ -+ return MDIO_PHY_ID_C45 | (prtad << 5) | devad; -+} -+ -+static inline bool mdio_phy_id_is_c45(int phy_id) -+{ -+ return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK); -+} -+ -+static inline __u16 mdio_phy_id_prtad(int phy_id) -+{ -+ return (phy_id & MDIO_PHY_ID_PRTAD) >> 5; -+} -+ -+static inline __u16 mdio_phy_id_devad(int phy_id) -+{ -+ return phy_id & MDIO_PHY_ID_DEVAD; -+} -+ -+#define MDIO_SUPPORTS_C22 1 -+#define MDIO_SUPPORTS_C45 2 -+ -+#ifdef __KERNEL__ -+ -+/** -+ * struct mdio_if_info - Ethernet controller MDIO interface -+ * @prtad: PRTAD of the PHY (%MDIO_PRTAD_NONE if not present/unknown) -+ * @mmds: Mask of MMDs expected to be present in the PHY. This must be -+ * non-zero unless @prtad = %MDIO_PRTAD_NONE. -+ * @mode_support: MDIO modes supported. If %MDIO_SUPPORTS_C22 is set then -+ * MII register access will be passed through with @devad = -+ * %MDIO_DEVAD_NONE. If %MDIO_EMULATE_C22 is set then access to -+ * commonly used clause 22 registers will be translated into -+ * clause 45 registers. -+ * @dev: Net device structure -+ * @mdio_read: Register read function; returns value or negative error code -+ * @mdio_write: Register write function; returns 0 or negative error code -+ */ -+struct mdio_if_info { -+ int prtad; -+ u32 mmds; -+ unsigned mode_support; -+ -+ struct net_device *dev; -+ int (*mdio_read)(struct net_device *dev, int prtad, int devad, -+ u16 addr); -+ int (*mdio_write)(struct net_device *dev, int prtad, int devad, -+ u16 addr, u16 val); -+}; -+ -+#define MDIO_PRTAD_NONE (-1) -+#define MDIO_DEVAD_NONE (-1) -+#define MDIO_EMULATE_C22 4 -+ -+struct ethtool_cmd; -+struct ethtool_pauseparam; -+extern int mdio45_probe(struct mdio_if_info *mdio, int prtad); -+extern int mdio_set_flag(const struct mdio_if_info *mdio, -+ int prtad, int devad, u16 addr, int mask, -+ bool sense); -+extern int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmds); -+extern int mdio45_nway_restart(const struct mdio_if_info *mdio); -+extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, -+ struct ethtool_cmd *ecmd, -+ u32 npage_adv, u32 npage_lpa); -+extern void -+mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio, -+ const struct ethtool_pauseparam *ecmd); -+ -+/** -+ * mdio45_ethtool_gset - get settings for ETHTOOL_GSET -+ * @mdio: MDIO interface -+ * @ecmd: Ethtool request structure -+ * -+ * Since the CSRs for auto-negotiation using next pages are not fully -+ * standardised, this function does not attempt to decode them. Use -+ * mdio45_ethtool_gset_npage() to specify advertisement bits from next -+ * pages. -+ */ -+static inline void mdio45_ethtool_gset(const struct mdio_if_info *mdio, -+ struct ethtool_cmd *ecmd) -+{ -+ mdio45_ethtool_gset_npage(mdio, ecmd, 0, 0); -+} -+ -+extern int mdio_mii_ioctl(const struct mdio_if_info *mdio, -+ struct mii_ioctl_data *mii_data, int cmd); -+ -+#endif /* __KERNEL__ */ -+#endif /* __LINUX_MDIO_H__ */ diff --git a/debian/patches/libdde_netdev_tx_t.patch b/debian/patches/libdde_netdev_tx_t.patch deleted file mode 100644 index 897f899f..00000000 --- a/debian/patches/libdde_netdev_tx_t.patch +++ /dev/null @@ -1,66 +0,0 @@ -commit dc1f8bf68b311b1537cb65893430b6796118498a -Author: Stephen Hemminger <shemminger@vyatta.com> -Date: Mon Aug 31 19:50:40 2009 +0000 - - netdev: change transmit to limited range type - - The transmit function should only return one of three possible values, - some drivers got confused and returned errno's or other values. - This changes the definition so that this can be caught at compile time. - - Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> - Signed-off-by: David S. Miller <davem@davemloft.net> - -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index 60d3aac..376a2e1 100644 ---- a/libdde-linux26/contrib/include/linux/netdevice.h -+++ b/libdde-linux26/contrib/include/linux/netdevice.h -@@ -79,17 +79,19 @@ struct wireless_dev; - #define net_xmit_eval(e) ((e) == NET_XMIT_CN? 0 : (e)) - #define net_xmit_errno(e) ((e) != NET_XMIT_CN ? -ENOBUFS : 0) - -+/* Driver transmit return codes */ -+enum netdev_tx { -+ NETDEV_TX_OK = 0, /* driver took care of packet */ -+ NETDEV_TX_BUSY, /* driver tx path was busy*/ -+ NETDEV_TX_LOCKED = -1, /* driver tx lock was already taken */ -+}; -+typedef enum netdev_tx netdev_tx_t; -+ - #endif - - #define MAX_ADDR_LEN 32 /* Largest hardware address length */ - --/* Driver transmit return codes */ --#define NETDEV_TX_OK 0 /* driver took care of packet */ --#define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ --#define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ -- - #ifdef __KERNEL__ -- - /* - * Compute the worst case header length according to the protocols - * used. -@@ -507,9 +509,11 @@ struct netdev_queue { - * This function is called when network device transistions to the down - * state. - * -- * int (*ndo_start_xmit)(struct sk_buff *skb, struct net_device *dev); -+ * netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb, -+ * struct net_device *dev); - * Called when a packet needs to be transmitted. -- * Must return NETDEV_TX_OK , NETDEV_TX_BUSY, or NETDEV_TX_LOCKED, -+ * Must return NETDEV_TX_OK , NETDEV_TX_BUSY. -+ * (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX) - * Required can not be NULL. - * - * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb); -@@ -580,7 +584,7 @@ struct net_device_ops { - void (*ndo_uninit)(struct net_device *dev); - int (*ndo_open)(struct net_device *dev); - int (*ndo_stop)(struct net_device *dev); -- int (*ndo_start_xmit) (struct sk_buff *skb, -+ netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb, - struct net_device *dev); - u16 (*ndo_select_queue)(struct net_device *dev, - struct sk_buff *skb); diff --git a/debian/patches/libdde_pci-needs_freset.patch b/debian/patches/libdde_pci-needs_freset.patch deleted file mode 100644 index b3029fcb..00000000 --- a/debian/patches/libdde_pci-needs_freset.patch +++ /dev/null @@ -1,39 +0,0 @@ -commit 260d703adc5f275e3ba7ddff6e2e0217bc613b35 -Author: Mike Mason <mmlnx@us.ibm.com> -Date: Thu Jul 30 15:33:21 2009 -0700 - - PCI: support for PCI Express fundamental reset - - This is the first of three patches that implement a bit field that PCI - Express device drivers can use to indicate they need a fundamental reset - during error recovery. - - By default, the EEH framework on powerpc does what's known as a "hot - reset" during recovery of a PCI Express device. We've found a case - where the device needs a "fundamental reset" to recover properly. The - current PCI error recovery and EEH frameworks do not support this - distinction. - - The attached patch (courtesy of Richard Lary) adds a bit field to - pci_dev that indicates whether the device requires a fundamental reset - during recovery. - - These patches supersede the previously submitted patch that implemented - a fundamental reset bit field. - - Signed-off-by: Mike Mason <mmlnx@us.ibm.com> - Signed-off-by: Richard Lary <rlary@us.ibm.com> - Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> - -Index: hurd-debian/libdde-linux26/contrib/include/linux/pci.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/pci.h 2012-04-16 00:26:44.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/pci.h 2012-04-16 00:34:37.000000000 +0000 -@@ -256,6 +256,7 @@ - unsigned int ari_enabled:1; /* ARI forwarding */ - unsigned int is_managed:1; - unsigned int is_pcie:1; -+ unsigned int needs_freset:1; /* Dev requires fundamental reset */ - unsigned int state_saved:1; - pci_dev_flags_t dev_flags; - atomic_t enable_cnt; /* pci_enable_device has been called */ diff --git a/debian/patches/libdde_pci_ids.h.patch b/debian/patches/libdde_pci_ids.h.patch deleted file mode 100644 index 801c38be..00000000 --- a/debian/patches/libdde_pci_ids.h.patch +++ /dev/null @@ -1,515 +0,0 @@ ---- a/libdde-linux26/contrib/include/linux/pci_ids.h 2012-04-15 20:31:32.000000000 +0000 -+++ b/libdde-linux26/contrib/include/linux/pci_ids.h 2012-03-17 10:14:52.000000000 +0000 -@@ -2,6 +2,9 @@ - * PCI Class, Vendor and Device IDs - * - * Please keep sorted. -+ * -+ * Do not add new entries to this file unless the definitions -+ * are shared between multiple drivers. - */ - - /* Device classes and subclasses */ -@@ -104,6 +107,7 @@ - #define PCI_CLASS_SERIAL_USB_UHCI 0x0c0300 - #define PCI_CLASS_SERIAL_USB_OHCI 0x0c0310 - #define PCI_CLASS_SERIAL_USB_EHCI 0x0c0320 -+#define PCI_CLASS_SERIAL_USB_XHCI 0x0c0330 - #define PCI_CLASS_SERIAL_FIBER 0x0c04 - #define PCI_CLASS_SERIAL_SMBUS 0x0c05 - -@@ -389,6 +393,9 @@ - #define PCI_DEVICE_ID_VLSI_82C147 0x0105 - #define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 - -+/* AMD RD890 Chipset */ -+#define PCI_DEVICE_ID_RD890_IOMMU 0x5a23 -+ - #define PCI_VENDOR_ID_ADL 0x1005 - #define PCI_DEVICE_ID_ADL_2301 0x2301 - -@@ -478,6 +485,9 @@ - #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361 - #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL 0x252 - -+#define PCI_SUBVENDOR_ID_IBM 0x1014 -+#define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT 0x03d4 -+ - #define PCI_VENDOR_ID_UNISYS 0x1018 - #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C - -@@ -526,6 +536,7 @@ - #define PCI_DEVICE_ID_AMD_OPUS_7443 0x7443 - #define PCI_DEVICE_ID_AMD_VIPER_7443 0x7443 - #define PCI_DEVICE_ID_AMD_OPUS_7445 0x7445 -+#define PCI_DEVICE_ID_AMD_8111_PCI 0x7460 - #define PCI_DEVICE_ID_AMD_8111_LPC 0x7468 - #define PCI_DEVICE_ID_AMD_8111_IDE 0x7469 - #define PCI_DEVICE_ID_AMD_8111_SMBUS2 0x746a -@@ -535,6 +546,8 @@ - #define PCI_DEVICE_ID_AMD_8131_BRIDGE 0x7450 - #define PCI_DEVICE_ID_AMD_8131_APIC 0x7451 - #define PCI_DEVICE_ID_AMD_8132_BRIDGE 0x7458 -+#define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS 0x780b -+#define PCI_DEVICE_ID_AMD_CS5535_IDE 0x208F - #define PCI_DEVICE_ID_AMD_CS5536_ISA 0x2090 - #define PCI_DEVICE_ID_AMD_CS5536_FLASH 0x2091 - #define PCI_DEVICE_ID_AMD_CS5536_AUDIO 0x2093 -@@ -543,9 +556,10 @@ - #define PCI_DEVICE_ID_AMD_CS5536_UDC 0x2096 - #define PCI_DEVICE_ID_AMD_CS5536_UOC 0x2097 - #define PCI_DEVICE_ID_AMD_CS5536_IDE 0x209A -- - #define PCI_DEVICE_ID_AMD_LX_VIDEO 0x2081 - #define PCI_DEVICE_ID_AMD_LX_AES 0x2082 -+#define PCI_DEVICE_ID_AMD_HUDSON2_IDE 0x780c -+#define PCI_DEVICE_ID_AMD_HUDSON2_SATA_IDE 0x7800 - - #define PCI_VENDOR_ID_TRIDENT 0x1023 - #define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000 -@@ -591,6 +605,8 @@ - #define PCI_DEVICE_ID_MATROX_G550 0x2527 - #define PCI_DEVICE_ID_MATROX_VIA 0x4536 - -+#define PCI_VENDOR_ID_MOBILITY_ELECTRONICS 0x14f2 -+ - #define PCI_VENDOR_ID_CT 0x102c - #define PCI_DEVICE_ID_CT_69000 0x00c0 - #define PCI_DEVICE_ID_CT_65545 0x00d8 -@@ -766,6 +782,7 @@ - #define PCI_DEVICE_ID_TI_X515 0x8036 - #define PCI_DEVICE_ID_TI_XX12 0x8039 - #define PCI_DEVICE_ID_TI_XX12_FM 0x803b -+#define PCI_DEVICE_ID_TI_XIO2000A 0x8231 - #define PCI_DEVICE_ID_TI_1130 0xac12 - #define PCI_DEVICE_ID_TI_1031 0xac13 - #define PCI_DEVICE_ID_TI_1131 0xac15 -@@ -834,6 +851,8 @@ - #define PCI_DEVICE_ID_PROMISE_20276 0x5275 - #define PCI_DEVICE_ID_PROMISE_20277 0x7275 - -+#define PCI_VENDOR_ID_FOXCONN 0x105b -+ - #define PCI_VENDOR_ID_UMC 0x1060 - #define PCI_DEVICE_ID_UMC_UM8673F 0x0101 - #define PCI_DEVICE_ID_UMC_UM8886BF 0x673a -@@ -873,6 +892,7 @@ - #define PCI_DEVICE_ID_APPLE_SH_SUNGEM 0x0051 - #define PCI_DEVICE_ID_APPLE_U3L_AGP 0x0058 - #define PCI_DEVICE_ID_APPLE_U3H_AGP 0x0059 -+#define PCI_DEVICE_ID_APPLE_U4_PCIE 0x005b - #define PCI_DEVICE_ID_APPLE_IPID2_AGP 0x0066 - #define PCI_DEVICE_ID_APPLE_IPID2_ATA 0x0069 - #define PCI_DEVICE_ID_APPLE_IPID2_FW 0x006a -@@ -941,6 +961,32 @@ - #define PCI_DEVICE_ID_SUN_TOMATILLO 0xa801 - #define PCI_DEVICE_ID_SUN_CASSINI 0xabba - -+#define PCI_VENDOR_ID_NI 0x1093 -+#define PCI_DEVICE_ID_NI_PCI2322 0xd130 -+#define PCI_DEVICE_ID_NI_PCI2324 0xd140 -+#define PCI_DEVICE_ID_NI_PCI2328 0xd150 -+#define PCI_DEVICE_ID_NI_PXI8422_2322 0xd190 -+#define PCI_DEVICE_ID_NI_PXI8422_2324 0xd1a0 -+#define PCI_DEVICE_ID_NI_PXI8420_2322 0xd1d0 -+#define PCI_DEVICE_ID_NI_PXI8420_2324 0xd1e0 -+#define PCI_DEVICE_ID_NI_PXI8420_2328 0xd1f0 -+#define PCI_DEVICE_ID_NI_PXI8420_23216 0xd1f1 -+#define PCI_DEVICE_ID_NI_PCI2322I 0xd250 -+#define PCI_DEVICE_ID_NI_PCI2324I 0xd270 -+#define PCI_DEVICE_ID_NI_PCI23216 0xd2b0 -+#define PCI_DEVICE_ID_NI_PXI8430_2322 0x7080 -+#define PCI_DEVICE_ID_NI_PCI8430_2322 0x70db -+#define PCI_DEVICE_ID_NI_PXI8430_2324 0x70dd -+#define PCI_DEVICE_ID_NI_PCI8430_2324 0x70df -+#define PCI_DEVICE_ID_NI_PXI8430_2328 0x70e2 -+#define PCI_DEVICE_ID_NI_PCI8430_2328 0x70e4 -+#define PCI_DEVICE_ID_NI_PXI8430_23216 0x70e6 -+#define PCI_DEVICE_ID_NI_PCI8430_23216 0x70e7 -+#define PCI_DEVICE_ID_NI_PXI8432_2322 0x70e8 -+#define PCI_DEVICE_ID_NI_PCI8432_2322 0x70ea -+#define PCI_DEVICE_ID_NI_PXI8432_2324 0x70ec -+#define PCI_DEVICE_ID_NI_PCI8432_2324 0x70ee -+ - #define PCI_VENDOR_ID_CMD 0x1095 - #define PCI_DEVICE_ID_CMD_643 0x0643 - #define PCI_DEVICE_ID_CMD_646 0x0646 -@@ -976,6 +1022,7 @@ - #define PCI_DEVICE_ID_PLX_PCI200SYN 0x3196 - #define PCI_DEVICE_ID_PLX_9030 0x9030 - #define PCI_DEVICE_ID_PLX_9050 0x9050 -+#define PCI_DEVICE_ID_PLX_9056 0x9056 - #define PCI_DEVICE_ID_PLX_9080 0x9080 - #define PCI_DEVICE_ID_PLX_GTEK_SERIAL2 0xa001 - -@@ -1037,8 +1084,6 @@ - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SMBUS 0x0034 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE 0x0035 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA 0x0036 --#define PCI_DEVICE_ID_NVIDIA_NVENET_10 0x0037 --#define PCI_DEVICE_ID_NVIDIA_NVENET_11 0x0038 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2 0x003e - #define PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_ULTRA 0x0040 - #define PCI_DEVICE_ID_NVIDIA_GEFORCE_6800 0x0041 -@@ -1049,21 +1094,16 @@ - #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE 0x0053 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA 0x0054 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2 0x0055 --#define PCI_DEVICE_ID_NVIDIA_NVENET_8 0x0056 --#define PCI_DEVICE_ID_NVIDIA_NVENET_9 0x0057 - #define PCI_DEVICE_ID_NVIDIA_CK804_AUDIO 0x0059 - #define PCI_DEVICE_ID_NVIDIA_CK804_PCIE 0x005d - #define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS 0x0064 - #define PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE 0x0065 --#define PCI_DEVICE_ID_NVIDIA_NVENET_2 0x0066 - #define PCI_DEVICE_ID_NVIDIA_MCP2_MODEM 0x0069 - #define PCI_DEVICE_ID_NVIDIA_MCP2_AUDIO 0x006a - #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS 0x0084 - #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE 0x0085 --#define PCI_DEVICE_ID_NVIDIA_NVENET_4 0x0086 - #define PCI_DEVICE_ID_NVIDIA_MCP2S_MODEM 0x0089 - #define PCI_DEVICE_ID_NVIDIA_CK8_AUDIO 0x008a --#define PCI_DEVICE_ID_NVIDIA_NVENET_5 0x008c - #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA 0x008e - #define PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GT 0x0090 - #define PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GTX 0x0091 -@@ -1079,15 +1119,12 @@ - #define PCI_DEVICE_ID_NVIDIA_NFORCE3 0x00d1 - #define PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS 0x00d4 - #define PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE 0x00d5 --#define PCI_DEVICE_ID_NVIDIA_NVENET_3 0x00d6 - #define PCI_DEVICE_ID_NVIDIA_MCP3_MODEM 0x00d9 - #define PCI_DEVICE_ID_NVIDIA_MCP3_AUDIO 0x00da --#define PCI_DEVICE_ID_NVIDIA_NVENET_7 0x00df - #define PCI_DEVICE_ID_NVIDIA_NFORCE3S 0x00e1 - #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA 0x00e3 - #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS 0x00e4 - #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE 0x00e5 --#define PCI_DEVICE_ID_NVIDIA_NVENET_6 0x00e6 - #define PCI_DEVICE_ID_NVIDIA_CK8S_AUDIO 0x00ea - #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2 0x00ee - #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_ALT1 0x00f0 -@@ -1147,7 +1184,6 @@ - #define PCI_DEVICE_ID_NVIDIA_NFORCE_SMBUS 0x01b4 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_IDE 0x01bc - #define PCI_DEVICE_ID_NVIDIA_MCP1_MODEM 0x01c1 --#define PCI_DEVICE_ID_NVIDIA_NVENET_1 0x01c3 - #define PCI_DEVICE_ID_NVIDIA_NFORCE2 0x01e0 - #define PCI_DEVICE_ID_NVIDIA_GEFORCE3 0x0200 - #define PCI_DEVICE_ID_NVIDIA_GEFORCE3_1 0x0201 -@@ -1170,8 +1206,6 @@ - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE 0x036E - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA 0x037E - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2 0x037F --#define PCI_DEVICE_ID_NVIDIA_NVENET_12 0x0268 --#define PCI_DEVICE_ID_NVIDIA_NVENET_13 0x0269 - #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800 0x0280 - #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X 0x0281 - #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE 0x0282 -@@ -1218,42 +1252,22 @@ - #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2 0x0348 - #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000 0x034C - #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100 0x034E --#define PCI_DEVICE_ID_NVIDIA_NVENET_14 0x0372 - #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373 --#define PCI_DEVICE_ID_NVIDIA_NVENET_16 0x03E5 --#define PCI_DEVICE_ID_NVIDIA_NVENET_17 0x03E6 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS 0x03EB - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE 0x03EC --#define PCI_DEVICE_ID_NVIDIA_NVENET_18 0x03EE --#define PCI_DEVICE_ID_NVIDIA_NVENET_19 0x03EF - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2 0x03F6 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3 0x03F7 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_SMBUS 0x0446 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE 0x0448 --#define PCI_DEVICE_ID_NVIDIA_NVENET_20 0x0450 --#define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451 --#define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452 --#define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453 --#define PCI_DEVICE_ID_NVIDIA_NVENET_24 0x054C --#define PCI_DEVICE_ID_NVIDIA_NVENET_25 0x054D --#define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E --#define PCI_DEVICE_ID_NVIDIA_NVENET_27 0x054F --#define PCI_DEVICE_ID_NVIDIA_NVENET_28 0x07DC --#define PCI_DEVICE_ID_NVIDIA_NVENET_29 0x07DD --#define PCI_DEVICE_ID_NVIDIA_NVENET_30 0x07DE --#define PCI_DEVICE_ID_NVIDIA_NVENET_31 0x07DF -+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_SMBUS 0x0542 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C -+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS 0x0752 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 --#define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760 --#define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761 --#define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762 --#define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763 --#define PCI_DEVICE_ID_NVIDIA_NVENET_36 0x0AB0 --#define PCI_DEVICE_ID_NVIDIA_NVENET_37 0x0AB1 --#define PCI_DEVICE_ID_NVIDIA_NVENET_38 0x0AB2 --#define PCI_DEVICE_ID_NVIDIA_NVENET_39 0x0AB3 -+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8 -+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2 -+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA 0x0D85 - - #define PCI_VENDOR_ID_IMS 0x10e0 - #define PCI_DEVICE_ID_IMS_TT128 0x9128 -@@ -1281,6 +1295,13 @@ - - #define PCI_VENDOR_ID_CREATIVE 0x1102 /* duplicate: ECTIVA */ - #define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002 -+#define PCI_DEVICE_ID_CREATIVE_20K1 0x0005 -+#define PCI_DEVICE_ID_CREATIVE_20K2 0x000b -+#define PCI_SUBDEVICE_ID_CREATIVE_SB0760 0x0024 -+#define PCI_SUBDEVICE_ID_CREATIVE_SB08801 0x0041 -+#define PCI_SUBDEVICE_ID_CREATIVE_SB08802 0x0042 -+#define PCI_SUBDEVICE_ID_CREATIVE_SB08803 0x0043 -+#define PCI_SUBDEVICE_ID_CREATIVE_HENDRIX 0x6000 - - #define PCI_VENDOR_ID_ECTIVA 0x1102 /* duplicate: CREATIVE */ - #define PCI_DEVICE_ID_ECTIVA_EV1938 0x8938 -@@ -1373,7 +1394,7 @@ - #define PCI_DEVICE_ID_VIA_82C598_1 0x8598 - #define PCI_DEVICE_ID_VIA_838X_1 0xB188 - #define PCI_DEVICE_ID_VIA_83_87XX_1 0xB198 --#define PCI_DEVICE_ID_VIA_C409_IDE 0XC409 -+#define PCI_DEVICE_ID_VIA_VX855_IDE 0xC409 - #define PCI_DEVICE_ID_VIA_ANON 0xFFFF - - #define PCI_VENDOR_ID_SIEMENS 0x110A -@@ -1473,6 +1494,7 @@ - #define PCI_DEVICE_ID_SERVERWORKS_HT1000IDE 0x0214 - #define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217 - #define PCI_DEVICE_ID_SERVERWORKS_CSB6LPC 0x0227 -+#define PCI_DEVICE_ID_SERVERWORKS_HT1100LD 0x0408 - - #define PCI_VENDOR_ID_SBE 0x1176 - #define PCI_DEVICE_ID_SBE_WANXL100 0x0301 -@@ -1516,6 +1538,8 @@ - #define PCI_DEVICE_ID_ARTOP_ATP860R 0x0007 - #define PCI_DEVICE_ID_ARTOP_ATP865 0x0008 - #define PCI_DEVICE_ID_ARTOP_ATP865R 0x0009 -+#define PCI_DEVICE_ID_ARTOP_ATP867A 0x000A -+#define PCI_DEVICE_ID_ARTOP_ATP867B 0x000B - #define PCI_DEVICE_ID_ARTOP_AEC7610 0x8002 - #define PCI_DEVICE_ID_ARTOP_AEC7612UW 0x8010 - #define PCI_DEVICE_ID_ARTOP_AEC7612U 0x8020 -@@ -1813,6 +1837,10 @@ - #define PCI_SUBDEVICE_ID_HYPERCOPE_METRO 0x0107 - #define PCI_SUBDEVICE_ID_HYPERCOPE_CHAMP2 0x0108 - -+#define PCI_VENDOR_ID_DIGIGRAM 0x1369 -+#define PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_SERIAL_SUBSYSTEM 0xc001 -+#define PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_CAE_SERIAL_SUBSYSTEM 0xc002 -+ - #define PCI_VENDOR_ID_KAWASAKI 0x136b - #define PCI_DEVICE_ID_MCHIP_KL5A72002 0xff01 - -@@ -1880,6 +1908,8 @@ - #define PCI_SUBDEVICE_ID_CCD_SWYX4S 0xB540 - #define PCI_SUBDEVICE_ID_CCD_JH4S20 0xB550 - #define PCI_SUBDEVICE_ID_CCD_IOB8ST_1 0xB552 -+#define PCI_SUBDEVICE_ID_CCD_JHSE1 0xB553 -+#define PCI_SUBDEVICE_ID_CCD_JH8S 0xB55B - #define PCI_SUBDEVICE_ID_CCD_BN4S 0xB560 - #define PCI_SUBDEVICE_ID_CCD_BN8S 0xB562 - #define PCI_SUBDEVICE_ID_CCD_BNE1 0xB563 -@@ -1932,6 +1962,8 @@ - #define PCI_DEVICE_ID_LAVA_DSERIAL 0x0100 /* 2x 16550 */ - #define PCI_DEVICE_ID_LAVA_QUATRO_A 0x0101 /* 2x 16550, half of 4 port */ - #define PCI_DEVICE_ID_LAVA_QUATRO_B 0x0102 /* 2x 16550, half of 4 port */ -+#define PCI_DEVICE_ID_LAVA_QUATTRO_A 0x0120 /* 2x 16550A, half of 4 port */ -+#define PCI_DEVICE_ID_LAVA_QUATTRO_B 0x0121 /* 2x 16550A, half of 4 port */ - #define PCI_DEVICE_ID_LAVA_OCTO_A 0x0180 /* 4x 16550A, half of 8 port */ - #define PCI_DEVICE_ID_LAVA_OCTO_B 0x0181 /* 4x 16550A, half of 8 port */ - #define PCI_DEVICE_ID_LAVA_PORT_PLUS 0x0200 /* 2x 16650 */ -@@ -1962,15 +1994,21 @@ - #define PCI_DEVICE_ID_OXSEMI_PCIe952_1_U 0xC118 - #define PCI_DEVICE_ID_OXSEMI_PCIe952_1_GU 0xC11C - #define PCI_DEVICE_ID_OXSEMI_16PCI954 0x9501 -+#define PCI_DEVICE_ID_OXSEMI_C950 0x950B - #define PCI_DEVICE_ID_OXSEMI_16PCI95N 0x9511 - #define PCI_DEVICE_ID_OXSEMI_16PCI954PP 0x9513 - #define PCI_DEVICE_ID_OXSEMI_16PCI952 0x9521 - #define PCI_DEVICE_ID_OXSEMI_16PCI952PP 0x9523 -+#define PCI_SUBDEVICE_ID_OXSEMI_C950 0x0001 - - #define PCI_VENDOR_ID_CHELSIO 0x1425 - - #define PCI_VENDOR_ID_SAMSUNG 0x144d - -+#define PCI_VENDOR_ID_GIGABYTE 0x1458 -+ -+#define PCI_VENDOR_ID_AMBIT 0x1468 -+ - #define PCI_VENDOR_ID_MYRICOM 0x14c1 - - #define PCI_VENDOR_ID_TITAN 0x14D2 -@@ -1998,6 +2036,7 @@ - #define PCI_DEVICE_ID_AFAVLAB_P030 0x2182 - #define PCI_SUBDEVICE_ID_AFAVLAB_P061 0x2150 - -+#define PCI_VENDOR_ID_BCM_GVC 0x14a4 - #define PCI_VENDOR_ID_BROADCOM 0x14e4 - #define PCI_DEVICE_ID_TIGON3_5752 0x1600 - #define PCI_DEVICE_ID_TIGON3_5752M 0x1601 -@@ -2047,7 +2086,6 @@ - #define PCI_DEVICE_ID_TIGON3_5787M 0x1693 - #define PCI_DEVICE_ID_TIGON3_5782 0x1696 - #define PCI_DEVICE_ID_TIGON3_5784 0x1698 --#define PCI_DEVICE_ID_TIGON3_5785 0x1699 - #define PCI_DEVICE_ID_TIGON3_5786 0x169a - #define PCI_DEVICE_ID_TIGON3_5787 0x169b - #define PCI_DEVICE_ID_TIGON3_5788 0x169c -@@ -2077,6 +2115,7 @@ - #define PCI_VENDOR_ID_MAINPINE 0x1522 - #define PCI_DEVICE_ID_MAINPINE_PBRIDGE 0x0100 - #define PCI_VENDOR_ID_ENE 0x1524 -+#define PCI_DEVICE_ID_ENE_CB710_FLASH 0x0510 - #define PCI_DEVICE_ID_ENE_CB712_SD 0x0550 - #define PCI_DEVICE_ID_ENE_CB712_SD_2 0x0551 - #define PCI_DEVICE_ID_ENE_CB714_SD 0x0750 -@@ -2112,6 +2151,8 @@ - #define PCI_DEVICE_ID_MELLANOX_SINAI_OLD 0x5e8c - #define PCI_DEVICE_ID_MELLANOX_SINAI 0x6274 - -+#define PCI_VENDOR_ID_DFI 0x15bd -+ - #define PCI_VENDOR_ID_QUICKNET 0x15e2 - #define PCI_DEVICE_ID_QUICKNET_XJ 0x0500 - -@@ -2131,6 +2172,10 @@ - #define PCI_DEVICE_ID_ADDIDATA_APCI7420_3 0x700D - #define PCI_DEVICE_ID_ADDIDATA_APCI7300_3 0x700E - #define PCI_DEVICE_ID_ADDIDATA_APCI7800_3 0x700F -+#define PCI_DEVICE_ID_ADDIDATA_APCIe7300 0x7010 -+#define PCI_DEVICE_ID_ADDIDATA_APCIe7420 0x7011 -+#define PCI_DEVICE_ID_ADDIDATA_APCIe7500 0x7012 -+#define PCI_DEVICE_ID_ADDIDATA_APCIe7800 0x7013 - - #define PCI_VENDOR_ID_PDC 0x15e9 - -@@ -2215,10 +2260,20 @@ - - #define PCI_VENDOR_ID_TOPSPIN 0x1867 - -+#define PCI_VENDOR_ID_SILAN 0x1904 -+ - #define PCI_VENDOR_ID_TDI 0x192E - #define PCI_DEVICE_ID_TDI_EHCI 0x0101 - - #define PCI_VENDOR_ID_FREESCALE 0x1957 -+#define PCI_DEVICE_ID_MPC8315E 0x00b4 -+#define PCI_DEVICE_ID_MPC8315 0x00b5 -+#define PCI_DEVICE_ID_MPC8314E 0x00b6 -+#define PCI_DEVICE_ID_MPC8314 0x00b7 -+#define PCI_DEVICE_ID_MPC8378E 0x00c4 -+#define PCI_DEVICE_ID_MPC8378 0x00c5 -+#define PCI_DEVICE_ID_MPC8377E 0x00c6 -+#define PCI_DEVICE_ID_MPC8377 0x00c7 - #define PCI_DEVICE_ID_MPC8548E 0x0012 - #define PCI_DEVICE_ID_MPC8548 0x0013 - #define PCI_DEVICE_ID_MPC8543E 0x0014 -@@ -2226,6 +2281,8 @@ - #define PCI_DEVICE_ID_MPC8547E 0x0018 - #define PCI_DEVICE_ID_MPC8545E 0x0019 - #define PCI_DEVICE_ID_MPC8545 0x001a -+#define PCI_DEVICE_ID_MPC8569E 0x0061 -+#define PCI_DEVICE_ID_MPC8569 0x0060 - #define PCI_DEVICE_ID_MPC8568E 0x0020 - #define PCI_DEVICE_ID_MPC8568 0x0021 - #define PCI_DEVICE_ID_MPC8567E 0x0022 -@@ -2238,6 +2295,22 @@ - #define PCI_DEVICE_ID_MPC8572 0x0041 - #define PCI_DEVICE_ID_MPC8536E 0x0050 - #define PCI_DEVICE_ID_MPC8536 0x0051 -+#define PCI_DEVICE_ID_P2020E 0x0070 -+#define PCI_DEVICE_ID_P2020 0x0071 -+#define PCI_DEVICE_ID_P2010E 0x0078 -+#define PCI_DEVICE_ID_P2010 0x0079 -+#define PCI_DEVICE_ID_P1020E 0x0100 -+#define PCI_DEVICE_ID_P1020 0x0101 -+#define PCI_DEVICE_ID_P1011E 0x0108 -+#define PCI_DEVICE_ID_P1011 0x0109 -+#define PCI_DEVICE_ID_P1022E 0x0110 -+#define PCI_DEVICE_ID_P1022 0x0111 -+#define PCI_DEVICE_ID_P1013E 0x0118 -+#define PCI_DEVICE_ID_P1013 0x0119 -+#define PCI_DEVICE_ID_P4080E 0x0400 -+#define PCI_DEVICE_ID_P4080 0x0401 -+#define PCI_DEVICE_ID_P4040E 0x0408 -+#define PCI_DEVICE_ID_P4040 0x0409 - #define PCI_DEVICE_ID_MPC8641 0x7010 - #define PCI_DEVICE_ID_MPC8641D 0x7011 - #define PCI_DEVICE_ID_MPC8610 0x7018 -@@ -2251,6 +2324,7 @@ - #define PCI_VENDOR_ID_JMICRON 0x197B - #define PCI_DEVICE_ID_JMICRON_JMB360 0x2360 - #define PCI_DEVICE_ID_JMICRON_JMB361 0x2361 -+#define PCI_DEVICE_ID_JMICRON_JMB362 0x2362 - #define PCI_DEVICE_ID_JMICRON_JMB363 0x2363 - #define PCI_DEVICE_ID_JMICRON_JMB365 0x2365 - #define PCI_DEVICE_ID_JMICRON_JMB366 0x2366 -@@ -2263,6 +2337,10 @@ - #define PCI_DEVICE_ID_KORENIX_JETCARDF0 0x1600 - #define PCI_DEVICE_ID_KORENIX_JETCARDF1 0x16ff - -+#define PCI_VENDOR_ID_QMI 0x1a32 -+ -+#define PCI_VENDOR_ID_AZWAVE 0x1a3b -+ - #define PCI_VENDOR_ID_TEKRAM 0x1de1 - #define PCI_DEVICE_ID_TEKRAM_DC290 0xdc29 - -@@ -2342,6 +2420,9 @@ - #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 - #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 - #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 -+#define PCI_DEVICE_ID_INTEL_CPT_SMBUS 0x1c22 -+#define PCI_DEVICE_ID_INTEL_CPT_LPC1 0x1c42 -+#define PCI_DEVICE_ID_INTEL_CPT_LPC2 0x1c43 - #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 - #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 - #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 -@@ -2373,6 +2454,7 @@ - #define PCI_DEVICE_ID_INTEL_82801CA_12 0x248c - #define PCI_DEVICE_ID_INTEL_82801DB_0 0x24c0 - #define PCI_DEVICE_ID_INTEL_82801DB_1 0x24c1 -+#define PCI_DEVICE_ID_INTEL_82801DB_2 0x24c2 - #define PCI_DEVICE_ID_INTEL_82801DB_3 0x24c3 - #define PCI_DEVICE_ID_INTEL_82801DB_5 0x24c5 - #define PCI_DEVICE_ID_INTEL_82801DB_6 0x24c6 -@@ -2463,6 +2545,8 @@ - #define PCI_DEVICE_ID_INTEL_IOAT_TBG3 0x3433 - #define PCI_DEVICE_ID_INTEL_82830_HB 0x3575 - #define PCI_DEVICE_ID_INTEL_82830_CGC 0x3577 -+#define PCI_DEVICE_ID_INTEL_82854_HB 0x358c -+#define PCI_DEVICE_ID_INTEL_82854_IG 0x358e - #define PCI_DEVICE_ID_INTEL_82855GM_HB 0x3580 - #define PCI_DEVICE_ID_INTEL_82855GM_IG 0x3582 - #define PCI_DEVICE_ID_INTEL_E7520_MCH 0x3590 -@@ -2476,6 +2560,16 @@ - #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e - #define PCI_DEVICE_ID_INTEL_IOAT_CNB 0x360b - #define PCI_DEVICE_ID_INTEL_FBD_CNB 0x360c -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF1 0x3711 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF2 0x3712 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF3 0x3713 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF4 0x3714 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF5 0x3715 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF6 0x3716 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF7 0x3717 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF8 0x3718 -+#define PCI_DEVICE_ID_INTEL_IOAT_JSF9 0x3719 - #define PCI_DEVICE_ID_INTEL_ICH10_0 0x3a14 - #define PCI_DEVICE_ID_INTEL_ICH10_1 0x3a16 - #define PCI_DEVICE_ID_INTEL_ICH10_2 0x3a18 -@@ -2606,6 +2700,7 @@ - #define PCI_DEVICE_ID_NETMOS_9835 0x9835 - #define PCI_DEVICE_ID_NETMOS_9845 0x9845 - #define PCI_DEVICE_ID_NETMOS_9855 0x9855 -+#define PCI_DEVICE_ID_NETMOS_9901 0x9901 - - #define PCI_VENDOR_ID_3COM_2 0xa727 - diff --git a/debian/patches/libdde_phy.patch b/debian/patches/libdde_phy.patch deleted file mode 100644 index 5d992c09..00000000 --- a/debian/patches/libdde_phy.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- a/libdde-linux26/contrib/include/linux/phy.h 2012-04-15 20:31:32.000000000 +0000 -+++ b/libdde-linux26/contrib/include/linux/phy.h 2012-03-17 10:14:52.000000000 +0000 -@@ -79,7 +79,7 @@ - * Need to be a little smaller than phydev->dev.bus_id to leave room - * for the ":%02x" - */ --#define MII_BUS_ID_SIZE (BUS_ID_SIZE - 3) -+#define MII_BUS_ID_SIZE (20 - 3) - - /* - * The Bus class for PHYs. Devices which provide access to -@@ -315,8 +315,7 @@ - - /* Interrupt and Polling infrastructure */ - struct work_struct phy_queue; -- struct work_struct state_queue; -- struct timer_list phy_timer; -+ struct delayed_work state_queue; - atomic_t irq_disable; - - struct mutex lock; -@@ -389,6 +388,12 @@ - /* Enables or disables interrupts */ - int (*config_intr)(struct phy_device *phydev); - -+ /* -+ * Checks if the PHY generated an interrupt. -+ * For multi-PHY devices with shared PHY interrupt pin -+ */ -+ int (*did_interrupt)(struct phy_device *phydev); -+ - /* Clears up any memory if needed */ - void (*remove)(struct phy_device *phydev); - -@@ -402,7 +407,7 @@ - /* A Structure for boards to register fixups with the PHY Lib */ - struct phy_fixup { - struct list_head list; -- char bus_id[BUS_ID_SIZE]; -+ char bus_id[20]; - u32 phy_uid; - u32 phy_uid_mask; - int (*run)(struct phy_device *phydev); -@@ -439,10 +444,16 @@ - - int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); - struct phy_device* get_phy_device(struct mii_bus *bus, int addr); -+int phy_device_register(struct phy_device *phy); - int phy_clear_interrupt(struct phy_device *phydev); - int phy_config_interrupt(struct phy_device *phydev, u32 interrupts); -+int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, -+ u32 flags, phy_interface_t interface); - struct phy_device * phy_attach(struct net_device *dev, - const char *bus_id, u32 flags, phy_interface_t interface); -+int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, -+ void (*handler)(struct net_device *), u32 flags, -+ phy_interface_t interface); - struct phy_device * phy_connect(struct net_device *dev, const char *bus_id, - void (*handler)(struct net_device *), u32 flags, - phy_interface_t interface); diff --git a/debian/patches/libdde_pr_cont.patch b/debian/patches/libdde_pr_cont.patch deleted file mode 100644 index 90c5ed81..00000000 --- a/debian/patches/libdde_pr_cont.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/libdde-linux26/include/linux/kernel.h b/libdde-linux26/include/linux/kernel.h -index 573ed07..6354939 100644 ---- a/libdde-linux26/include/linux/kernel.h -+++ b/libdde-linux26/include/linux/kernel.h -@@ -363,6 +363,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte) - printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) - #define pr_info(fmt, ...) \ - printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) -+#define pr_cont(fmt, ...) \ -+ printk(KERN_CONT fmt, ##__VA_ARGS__) - - #if defined(DEBUG) - #ifndef DDE_LINUX -diff --git a/libdde-linux26/contrib/include/linux/kernel.h b/libdde-linux26/contrib/include/linux/kernel.h -index 7fa3718..0bded10 100644 ---- a/libdde-linux26/contrib/include/linux/kernel.h -+++ b/libdde-linux26/contrib/include/linux/kernel.h -@@ -353,6 +353,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte) - printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) - #define pr_info(fmt, ...) \ - printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) -+#define pr_cont(fmt, ...) \ -+ printk(KERN_CONT fmt, ##__VA_ARGS__) - - /* If you are writing a driver, please use dev_dbg instead */ - #if defined(DEBUG) diff --git a/debian/patches/libdde_rcu.patch b/debian/patches/libdde_rcu.patch deleted file mode 100644 index 03245335..00000000 --- a/debian/patches/libdde_rcu.patch +++ /dev/null @@ -1,816 +0,0 @@ ---- /dev/null 2011-08-03 18:03:30.000000000 +0000 -+++ b/libdde-linux26/contrib/kernel/rcuclassic.c 2012-04-15 23:40:54.000000000 +0000 -@@ -0,0 +1,788 @@ -+/* -+ * Read-Copy Update mechanism for mutual exclusion -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ * -+ * Copyright IBM Corporation, 2001 -+ * -+ * Authors: Dipankar Sarma <dipankar@in.ibm.com> -+ * Manfred Spraul <manfred@colorfullife.com> -+ * -+ * Based on the original work by Paul McKenney <paulmck@us.ibm.com> -+ * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. -+ * Papers: -+ * http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf -+ * http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001) -+ * -+ * For detailed explanation of Read-Copy Update mechanism see - -+ * Documentation/RCU -+ * -+ */ -+#include <linux/types.h> -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/spinlock.h> -+#include <linux/smp.h> -+#include <linux/rcupdate.h> -+#include <linux/interrupt.h> -+#include <linux/sched.h> -+#include <asm/atomic.h> -+#include <linux/bitops.h> -+#include <linux/module.h> -+#include <linux/completion.h> -+#include <linux/moduleparam.h> -+#include <linux/percpu.h> -+#include <linux/notifier.h> -+#include <linux/cpu.h> -+#include <linux/mutex.h> -+#include <linux/time.h> -+ -+#ifdef CONFIG_DEBUG_LOCK_ALLOC -+static struct lock_class_key rcu_lock_key; -+struct lockdep_map rcu_lock_map = -+ STATIC_LOCKDEP_MAP_INIT("rcu_read_lock", &rcu_lock_key); -+EXPORT_SYMBOL_GPL(rcu_lock_map); -+#endif -+ -+ -+/* Definition for rcupdate control block. */ -+static struct rcu_ctrlblk rcu_ctrlblk = { -+ .cur = -300, -+ .completed = -300, -+ .pending = -300, -+ .lock = __SPIN_LOCK_UNLOCKED(&rcu_ctrlblk.lock), -+ .cpumask = CPU_BITS_NONE, -+}; -+static struct rcu_ctrlblk rcu_bh_ctrlblk = { -+ .cur = -300, -+ .completed = -300, -+ .pending = -300, -+ .lock = __SPIN_LOCK_UNLOCKED(&rcu_bh_ctrlblk.lock), -+ .cpumask = CPU_BITS_NONE, -+}; -+ -+DEFINE_PER_CPU(struct rcu_data, rcu_data) = { 0L }; -+DEFINE_PER_CPU(struct rcu_data, rcu_bh_data) = { 0L }; -+ -+static int blimit = 10; -+static int qhimark = 10000; -+static int qlowmark = 100; -+ -+#ifdef CONFIG_SMP -+static void force_quiescent_state(struct rcu_data *rdp, -+ struct rcu_ctrlblk *rcp) -+{ -+ int cpu; -+ unsigned long flags; -+ -+ set_need_resched(); -+ spin_lock_irqsave(&rcp->lock, flags); -+ if (unlikely(!rcp->signaled)) { -+ rcp->signaled = 1; -+ /* -+ * Don't send IPI to itself. With irqs disabled, -+ * rdp->cpu is the current cpu. -+ * -+ * cpu_online_mask is updated by the _cpu_down() -+ * using __stop_machine(). Since we're in irqs disabled -+ * section, __stop_machine() is not exectuting, hence -+ * the cpu_online_mask is stable. -+ * -+ * However, a cpu might have been offlined _just_ before -+ * we disabled irqs while entering here. -+ * And rcu subsystem might not yet have handled the CPU_DEAD -+ * notification, leading to the offlined cpu's bit -+ * being set in the rcp->cpumask. -+ * -+ * Hence cpumask = (rcp->cpumask & cpu_online_mask) to prevent -+ * sending smp_reschedule() to an offlined CPU. -+ */ -+ for_each_cpu_and(cpu, -+ to_cpumask(rcp->cpumask), cpu_online_mask) { -+ if (cpu != rdp->cpu) -+ smp_send_reschedule(cpu); -+ } -+ } -+ spin_unlock_irqrestore(&rcp->lock, flags); -+} -+#else -+static inline void force_quiescent_state(struct rcu_data *rdp, -+ struct rcu_ctrlblk *rcp) -+{ -+ set_need_resched(); -+} -+#endif -+ -+static void __call_rcu(struct rcu_head *head, struct rcu_ctrlblk *rcp, -+ struct rcu_data *rdp) -+{ -+ long batch; -+ -+ head->next = NULL; -+ smp_mb(); /* Read of rcu->cur must happen after any change by caller. */ -+ -+ /* -+ * Determine the batch number of this callback. -+ * -+ * Using ACCESS_ONCE to avoid the following error when gcc eliminates -+ * local variable "batch" and emits codes like this: -+ * 1) rdp->batch = rcp->cur + 1 # gets old value -+ * ...... -+ * 2)rcu_batch_after(rcp->cur + 1, rdp->batch) # gets new value -+ * then [*nxttail[0], *nxttail[1]) may contain callbacks -+ * that batch# = rdp->batch, see the comment of struct rcu_data. -+ */ -+ batch = ACCESS_ONCE(rcp->cur) + 1; -+ -+ if (rdp->nxtlist && rcu_batch_after(batch, rdp->batch)) { -+ /* process callbacks */ -+ rdp->nxttail[0] = rdp->nxttail[1]; -+ rdp->nxttail[1] = rdp->nxttail[2]; -+ if (rcu_batch_after(batch - 1, rdp->batch)) -+ rdp->nxttail[0] = rdp->nxttail[2]; -+ } -+ -+ rdp->batch = batch; -+ *rdp->nxttail[2] = head; -+ rdp->nxttail[2] = &head->next; -+ -+ if (unlikely(++rdp->qlen > qhimark)) { -+ rdp->blimit = INT_MAX; -+ force_quiescent_state(rdp, &rcu_ctrlblk); -+ } -+} -+ -+#ifdef CONFIG_RCU_CPU_STALL_DETECTOR -+ -+static void record_gp_stall_check_time(struct rcu_ctrlblk *rcp) -+{ -+ rcp->gp_start = jiffies; -+ rcp->jiffies_stall = jiffies + RCU_SECONDS_TILL_STALL_CHECK; -+} -+ -+static void print_other_cpu_stall(struct rcu_ctrlblk *rcp) -+{ -+ int cpu; -+ long delta; -+ unsigned long flags; -+ -+ /* Only let one CPU complain about others per time interval. */ -+ -+ spin_lock_irqsave(&rcp->lock, flags); -+ delta = jiffies - rcp->jiffies_stall; -+ if (delta < 2 || rcp->cur != rcp->completed) { -+ spin_unlock_irqrestore(&rcp->lock, flags); -+ return; -+ } -+ rcp->jiffies_stall = jiffies + RCU_SECONDS_TILL_STALL_RECHECK; -+ spin_unlock_irqrestore(&rcp->lock, flags); -+ -+ /* OK, time to rat on our buddy... */ -+ -+ printk(KERN_ERR "INFO: RCU detected CPU stalls:"); -+ for_each_possible_cpu(cpu) { -+ if (cpumask_test_cpu(cpu, to_cpumask(rcp->cpumask))) -+ printk(" %d", cpu); -+ } -+ printk(" (detected by %d, t=%ld jiffies)\n", -+ smp_processor_id(), (long)(jiffies - rcp->gp_start)); -+} -+ -+static void print_cpu_stall(struct rcu_ctrlblk *rcp) -+{ -+ unsigned long flags; -+ -+ printk(KERN_ERR "INFO: RCU detected CPU %d stall (t=%lu/%lu jiffies)\n", -+ smp_processor_id(), jiffies, -+ jiffies - rcp->gp_start); -+ dump_stack(); -+ spin_lock_irqsave(&rcp->lock, flags); -+ if ((long)(jiffies - rcp->jiffies_stall) >= 0) -+ rcp->jiffies_stall = -+ jiffies + RCU_SECONDS_TILL_STALL_RECHECK; -+ spin_unlock_irqrestore(&rcp->lock, flags); -+ set_need_resched(); /* kick ourselves to get things going. */ -+} -+ -+static void check_cpu_stall(struct rcu_ctrlblk *rcp) -+{ -+ long delta; -+ -+ delta = jiffies - rcp->jiffies_stall; -+ if (cpumask_test_cpu(smp_processor_id(), to_cpumask(rcp->cpumask)) && -+ delta >= 0) { -+ -+ /* We haven't checked in, so go dump stack. */ -+ print_cpu_stall(rcp); -+ -+ } else if (rcp->cur != rcp->completed && delta >= 2) { -+ -+ /* They had two seconds to dump stack, so complain. */ -+ print_other_cpu_stall(rcp); -+ } -+} -+ -+#else /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ -+ -+static void record_gp_stall_check_time(struct rcu_ctrlblk *rcp) -+{ -+} -+ -+static inline void check_cpu_stall(struct rcu_ctrlblk *rcp) -+{ -+} -+ -+#endif /* #else #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ -+ -+/** -+ * call_rcu - Queue an RCU callback for invocation after a grace period. -+ * @head: structure to be used for queueing the RCU updates. -+ * @func: actual update function to be invoked after the grace period -+ * -+ * The update function will be invoked some time after a full grace -+ * period elapses, in other words after all currently executing RCU -+ * read-side critical sections have completed. RCU read-side critical -+ * sections are delimited by rcu_read_lock() and rcu_read_unlock(), -+ * and may be nested. -+ */ -+void call_rcu(struct rcu_head *head, -+ void (*func)(struct rcu_head *rcu)) -+{ -+ unsigned long flags; -+ -+ head->func = func; -+ local_irq_save(flags); -+ __call_rcu(head, &rcu_ctrlblk, &__get_cpu_var(rcu_data)); -+ local_irq_restore(flags); -+} -+EXPORT_SYMBOL_GPL(call_rcu); -+ -+/** -+ * call_rcu_bh - Queue an RCU for invocation after a quicker grace period. -+ * @head: structure to be used for queueing the RCU updates. -+ * @func: actual update function to be invoked after the grace period -+ * -+ * The update function will be invoked some time after a full grace -+ * period elapses, in other words after all currently executing RCU -+ * read-side critical sections have completed. call_rcu_bh() assumes -+ * that the read-side critical sections end on completion of a softirq -+ * handler. This means that read-side critical sections in process -+ * context must not be interrupted by softirqs. This interface is to be -+ * used when most of the read-side critical sections are in softirq context. -+ * RCU read-side critical sections are delimited by rcu_read_lock() and -+ * rcu_read_unlock(), * if in interrupt context or rcu_read_lock_bh() -+ * and rcu_read_unlock_bh(), if in process context. These may be nested. -+ */ -+void call_rcu_bh(struct rcu_head *head, -+ void (*func)(struct rcu_head *rcu)) -+{ -+ unsigned long flags; -+ -+ head->func = func; -+ local_irq_save(flags); -+ __call_rcu(head, &rcu_bh_ctrlblk, &__get_cpu_var(rcu_bh_data)); -+ local_irq_restore(flags); -+} -+EXPORT_SYMBOL_GPL(call_rcu_bh); -+ -+/* -+ * Return the number of RCU batches processed thus far. Useful -+ * for debug and statistics. -+ */ -+long rcu_batches_completed(void) -+{ -+ return rcu_ctrlblk.completed; -+} -+EXPORT_SYMBOL_GPL(rcu_batches_completed); -+ -+/* -+ * Return the number of RCU batches processed thus far. Useful -+ * for debug and statistics. -+ */ -+long rcu_batches_completed_bh(void) -+{ -+ return rcu_bh_ctrlblk.completed; -+} -+EXPORT_SYMBOL_GPL(rcu_batches_completed_bh); -+ -+/* Raises the softirq for processing rcu_callbacks. */ -+static inline void raise_rcu_softirq(void) -+{ -+ raise_softirq(RCU_SOFTIRQ); -+} -+ -+/* -+ * Invoke the completed RCU callbacks. They are expected to be in -+ * a per-cpu list. -+ */ -+static void rcu_do_batch(struct rcu_data *rdp) -+{ -+ unsigned long flags; -+ struct rcu_head *next, *list; -+ int count = 0; -+ -+ list = rdp->donelist; -+ while (list) { -+ next = list->next; -+ prefetch(next); -+ list->func(list); -+ list = next; -+ if (++count >= rdp->blimit) -+ break; -+ } -+ rdp->donelist = list; -+ -+ local_irq_save(flags); -+ rdp->qlen -= count; -+ local_irq_restore(flags); -+ if (rdp->blimit == INT_MAX && rdp->qlen <= qlowmark) -+ rdp->blimit = blimit; -+ -+ if (!rdp->donelist) -+ rdp->donetail = &rdp->donelist; -+ else -+ raise_rcu_softirq(); -+} -+ -+/* -+ * Grace period handling: -+ * The grace period handling consists out of two steps: -+ * - A new grace period is started. -+ * This is done by rcu_start_batch. The start is not broadcasted to -+ * all cpus, they must pick this up by comparing rcp->cur with -+ * rdp->quiescbatch. All cpus are recorded in the -+ * rcu_ctrlblk.cpumask bitmap. -+ * - All cpus must go through a quiescent state. -+ * Since the start of the grace period is not broadcasted, at least two -+ * calls to rcu_check_quiescent_state are required: -+ * The first call just notices that a new grace period is running. The -+ * following calls check if there was a quiescent state since the beginning -+ * of the grace period. If so, it updates rcu_ctrlblk.cpumask. If -+ * the bitmap is empty, then the grace period is completed. -+ * rcu_check_quiescent_state calls rcu_start_batch(0) to start the next grace -+ * period (if necessary). -+ */ -+ -+/* -+ * Register a new batch of callbacks, and start it up if there is currently no -+ * active batch and the batch to be registered has not already occurred. -+ * Caller must hold rcu_ctrlblk.lock. -+ */ -+static void rcu_start_batch(struct rcu_ctrlblk *rcp) -+{ -+ if (rcp->cur != rcp->pending && -+ rcp->completed == rcp->cur) { -+ rcp->cur++; -+ record_gp_stall_check_time(rcp); -+ -+ /* -+ * Accessing nohz_cpu_mask before incrementing rcp->cur needs a -+ * Barrier Otherwise it can cause tickless idle CPUs to be -+ * included in rcp->cpumask, which will extend graceperiods -+ * unnecessarily. -+ */ -+ smp_mb(); -+ cpumask_andnot(to_cpumask(rcp->cpumask), -+ cpu_online_mask, nohz_cpu_mask); -+ -+ rcp->signaled = 0; -+ } -+} -+ -+/* -+ * cpu went through a quiescent state since the beginning of the grace period. -+ * Clear it from the cpu mask and complete the grace period if it was the last -+ * cpu. Start another grace period if someone has further entries pending -+ */ -+static void cpu_quiet(int cpu, struct rcu_ctrlblk *rcp) -+{ -+ cpumask_clear_cpu(cpu, to_cpumask(rcp->cpumask)); -+ if (cpumask_empty(to_cpumask(rcp->cpumask))) { -+ /* batch completed ! */ -+ rcp->completed = rcp->cur; -+ rcu_start_batch(rcp); -+ } -+} -+ -+/* -+ * Check if the cpu has gone through a quiescent state (say context -+ * switch). If so and if it already hasn't done so in this RCU -+ * quiescent cycle, then indicate that it has done so. -+ */ -+static void rcu_check_quiescent_state(struct rcu_ctrlblk *rcp, -+ struct rcu_data *rdp) -+{ -+ unsigned long flags; -+ -+ if (rdp->quiescbatch != rcp->cur) { -+ /* start new grace period: */ -+ rdp->qs_pending = 1; -+ rdp->passed_quiesc = 0; -+ rdp->quiescbatch = rcp->cur; -+ return; -+ } -+ -+ /* Grace period already completed for this cpu? -+ * qs_pending is checked instead of the actual bitmap to avoid -+ * cacheline trashing. -+ */ -+ if (!rdp->qs_pending) -+ return; -+ -+ /* -+ * Was there a quiescent state since the beginning of the grace -+ * period? If no, then exit and wait for the next call. -+ */ -+ if (!rdp->passed_quiesc) -+ return; -+ rdp->qs_pending = 0; -+ -+ spin_lock_irqsave(&rcp->lock, flags); -+ /* -+ * rdp->quiescbatch/rcp->cur and the cpu bitmap can come out of sync -+ * during cpu startup. Ignore the quiescent state. -+ */ -+ if (likely(rdp->quiescbatch == rcp->cur)) -+ cpu_quiet(rdp->cpu, rcp); -+ -+ spin_unlock_irqrestore(&rcp->lock, flags); -+} -+ -+ -+#ifdef CONFIG_HOTPLUG_CPU -+ -+/* warning! helper for rcu_offline_cpu. do not use elsewhere without reviewing -+ * locking requirements, the list it's pulling from has to belong to a cpu -+ * which is dead and hence not processing interrupts. -+ */ -+static void rcu_move_batch(struct rcu_data *this_rdp, struct rcu_head *list, -+ struct rcu_head **tail, long batch) -+{ -+ unsigned long flags; -+ -+ if (list) { -+ local_irq_save(flags); -+ this_rdp->batch = batch; -+ *this_rdp->nxttail[2] = list; -+ this_rdp->nxttail[2] = tail; -+ local_irq_restore(flags); -+ } -+} -+ -+static void __rcu_offline_cpu(struct rcu_data *this_rdp, -+ struct rcu_ctrlblk *rcp, struct rcu_data *rdp) -+{ -+ unsigned long flags; -+ -+ /* -+ * if the cpu going offline owns the grace period -+ * we can block indefinitely waiting for it, so flush -+ * it here -+ */ -+ spin_lock_irqsave(&rcp->lock, flags); -+ if (rcp->cur != rcp->completed) -+ cpu_quiet(rdp->cpu, rcp); -+ rcu_move_batch(this_rdp, rdp->donelist, rdp->donetail, rcp->cur + 1); -+ rcu_move_batch(this_rdp, rdp->nxtlist, rdp->nxttail[2], rcp->cur + 1); -+ spin_unlock(&rcp->lock); -+ -+ this_rdp->qlen += rdp->qlen; -+ local_irq_restore(flags); -+} -+ -+static void rcu_offline_cpu(int cpu) -+{ -+ struct rcu_data *this_rdp = &get_cpu_var(rcu_data); -+ struct rcu_data *this_bh_rdp = &get_cpu_var(rcu_bh_data); -+ -+ __rcu_offline_cpu(this_rdp, &rcu_ctrlblk, -+ &per_cpu(rcu_data, cpu)); -+ __rcu_offline_cpu(this_bh_rdp, &rcu_bh_ctrlblk, -+ &per_cpu(rcu_bh_data, cpu)); -+ put_cpu_var(rcu_data); -+ put_cpu_var(rcu_bh_data); -+} -+ -+#else -+ -+static void rcu_offline_cpu(int cpu) -+{ -+} -+ -+#endif -+ -+/* -+ * This does the RCU processing work from softirq context. -+ */ -+static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp, -+ struct rcu_data *rdp) -+{ -+ unsigned long flags; -+ long completed_snap; -+ -+ if (rdp->nxtlist) { -+ local_irq_save(flags); -+ completed_snap = ACCESS_ONCE(rcp->completed); -+ -+ /* -+ * move the other grace-period-completed entries to -+ * [rdp->nxtlist, *rdp->nxttail[0]) temporarily -+ */ -+ if (!rcu_batch_before(completed_snap, rdp->batch)) -+ rdp->nxttail[0] = rdp->nxttail[1] = rdp->nxttail[2]; -+ else if (!rcu_batch_before(completed_snap, rdp->batch - 1)) -+ rdp->nxttail[0] = rdp->nxttail[1]; -+ -+ /* -+ * the grace period for entries in -+ * [rdp->nxtlist, *rdp->nxttail[0]) has completed and -+ * move these entries to donelist -+ */ -+ if (rdp->nxttail[0] != &rdp->nxtlist) { -+ *rdp->donetail = rdp->nxtlist; -+ rdp->donetail = rdp->nxttail[0]; -+ rdp->nxtlist = *rdp->nxttail[0]; -+ *rdp->donetail = NULL; -+ -+ if (rdp->nxttail[1] == rdp->nxttail[0]) -+ rdp->nxttail[1] = &rdp->nxtlist; -+ if (rdp->nxttail[2] == rdp->nxttail[0]) -+ rdp->nxttail[2] = &rdp->nxtlist; -+ rdp->nxttail[0] = &rdp->nxtlist; -+ } -+ -+ local_irq_restore(flags); -+ -+ if (rcu_batch_after(rdp->batch, rcp->pending)) { -+ unsigned long flags2; -+ -+ /* and start it/schedule start if it's a new batch */ -+ spin_lock_irqsave(&rcp->lock, flags2); -+ if (rcu_batch_after(rdp->batch, rcp->pending)) { -+ rcp->pending = rdp->batch; -+ rcu_start_batch(rcp); -+ } -+ spin_unlock_irqrestore(&rcp->lock, flags2); -+ } -+ } -+ -+ rcu_check_quiescent_state(rcp, rdp); -+ if (rdp->donelist) -+ rcu_do_batch(rdp); -+} -+ -+static void rcu_process_callbacks(struct softirq_action *unused) -+{ -+ /* -+ * Memory references from any prior RCU read-side critical sections -+ * executed by the interrupted code must be see before any RCU -+ * grace-period manupulations below. -+ */ -+ -+ smp_mb(); /* See above block comment. */ -+ -+ __rcu_process_callbacks(&rcu_ctrlblk, &__get_cpu_var(rcu_data)); -+ __rcu_process_callbacks(&rcu_bh_ctrlblk, &__get_cpu_var(rcu_bh_data)); -+ -+ /* -+ * Memory references from any later RCU read-side critical sections -+ * executed by the interrupted code must be see after any RCU -+ * grace-period manupulations above. -+ */ -+ -+ smp_mb(); /* See above block comment. */ -+} -+ -+static int __rcu_pending(struct rcu_ctrlblk *rcp, struct rcu_data *rdp) -+{ -+ /* Check for CPU stalls, if enabled. */ -+ check_cpu_stall(rcp); -+ -+ if (rdp->nxtlist) { -+ long completed_snap = ACCESS_ONCE(rcp->completed); -+ -+ /* -+ * This cpu has pending rcu entries and the grace period -+ * for them has completed. -+ */ -+ if (!rcu_batch_before(completed_snap, rdp->batch)) -+ return 1; -+ if (!rcu_batch_before(completed_snap, rdp->batch - 1) && -+ rdp->nxttail[0] != rdp->nxttail[1]) -+ return 1; -+ if (rdp->nxttail[0] != &rdp->nxtlist) -+ return 1; -+ -+ /* -+ * This cpu has pending rcu entries and the new batch -+ * for then hasn't been started nor scheduled start -+ */ -+ if (rcu_batch_after(rdp->batch, rcp->pending)) -+ return 1; -+ } -+ -+ /* This cpu has finished callbacks to invoke */ -+ if (rdp->donelist) -+ return 1; -+ -+ /* The rcu core waits for a quiescent state from the cpu */ -+ if (rdp->quiescbatch != rcp->cur || rdp->qs_pending) -+ return 1; -+ -+ /* nothing to do */ -+ return 0; -+} -+ -+/* -+ * Check to see if there is any immediate RCU-related work to be done -+ * by the current CPU, returning 1 if so. This function is part of the -+ * RCU implementation; it is -not- an exported member of the RCU API. -+ */ -+int rcu_pending(int cpu) -+{ -+ return __rcu_pending(&rcu_ctrlblk, &per_cpu(rcu_data, cpu)) || -+ __rcu_pending(&rcu_bh_ctrlblk, &per_cpu(rcu_bh_data, cpu)); -+} -+ -+/* -+ * Check to see if any future RCU-related work will need to be done -+ * by the current CPU, even if none need be done immediately, returning -+ * 1 if so. This function is part of the RCU implementation; it is -not- -+ * an exported member of the RCU API. -+ */ -+int rcu_needs_cpu(int cpu) -+{ -+ struct rcu_data *rdp = &per_cpu(rcu_data, cpu); -+ struct rcu_data *rdp_bh = &per_cpu(rcu_bh_data, cpu); -+ -+ return !!rdp->nxtlist || !!rdp_bh->nxtlist || rcu_pending(cpu); -+} -+ -+/* -+ * Top-level function driving RCU grace-period detection, normally -+ * invoked from the scheduler-clock interrupt. This function simply -+ * increments counters that are read only from softirq by this same -+ * CPU, so there are no memory barriers required. -+ */ -+void rcu_check_callbacks(int cpu, int user) -+{ -+ if (user || -+ (idle_cpu(cpu) && rcu_scheduler_active && -+ !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) { -+ -+ /* -+ * Get here if this CPU took its interrupt from user -+ * mode or from the idle loop, and if this is not a -+ * nested interrupt. In this case, the CPU is in -+ * a quiescent state, so count it. -+ * -+ * Also do a memory barrier. This is needed to handle -+ * the case where writes from a preempt-disable section -+ * of code get reordered into schedule() by this CPU's -+ * write buffer. The memory barrier makes sure that -+ * the rcu_qsctr_inc() and rcu_bh_qsctr_inc() are see -+ * by other CPUs to happen after any such write. -+ */ -+ -+ smp_mb(); /* See above block comment. */ -+ rcu_qsctr_inc(cpu); -+ rcu_bh_qsctr_inc(cpu); -+ -+ } else if (!in_softirq()) { -+ -+ /* -+ * Get here if this CPU did not take its interrupt from -+ * softirq, in other words, if it is not interrupting -+ * a rcu_bh read-side critical section. This is an _bh -+ * critical section, so count it. The memory barrier -+ * is needed for the same reason as is the above one. -+ */ -+ -+ smp_mb(); /* See above block comment. */ -+ rcu_bh_qsctr_inc(cpu); -+ } -+ raise_rcu_softirq(); -+} -+ -+static void __cpuinit rcu_init_percpu_data(int cpu, struct rcu_ctrlblk *rcp, -+ struct rcu_data *rdp) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&rcp->lock, flags); -+ memset(rdp, 0, sizeof(*rdp)); -+ rdp->nxttail[0] = rdp->nxttail[1] = rdp->nxttail[2] = &rdp->nxtlist; -+ rdp->donetail = &rdp->donelist; -+ rdp->quiescbatch = rcp->completed; -+ rdp->qs_pending = 0; -+ rdp->cpu = cpu; -+ rdp->blimit = blimit; -+ spin_unlock_irqrestore(&rcp->lock, flags); -+} -+ -+static void __cpuinit rcu_online_cpu(int cpu) -+{ -+ struct rcu_data *rdp = &per_cpu(rcu_data, cpu); -+ struct rcu_data *bh_rdp = &per_cpu(rcu_bh_data, cpu); -+ -+ rcu_init_percpu_data(cpu, &rcu_ctrlblk, rdp); -+ rcu_init_percpu_data(cpu, &rcu_bh_ctrlblk, bh_rdp); -+ open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); -+} -+ -+static int __cpuinit rcu_cpu_notify(struct notifier_block *self, -+ unsigned long action, void *hcpu) -+{ -+ long cpu = (long)hcpu; -+ -+ switch (action) { -+ case CPU_UP_PREPARE: -+ case CPU_UP_PREPARE_FROZEN: -+ rcu_online_cpu(cpu); -+ break; -+ case CPU_DEAD: -+ case CPU_DEAD_FROZEN: -+ rcu_offline_cpu(cpu); -+ break; -+ default: -+ break; -+ } -+ return NOTIFY_OK; -+} -+ -+static struct notifier_block __cpuinitdata rcu_nb = { -+ .notifier_call = rcu_cpu_notify, -+}; -+ -+/* -+ * Initializes rcu mechanism. Assumed to be called early. -+ * That is before local timer(SMP) or jiffie timer (uniproc) is setup. -+ * Note that rcu_qsctr and friends are implicitly -+ * initialized due to the choice of ``0'' for RCU_CTR_INVALID. -+ */ -+void __init __rcu_init(void) -+{ -+#ifdef CONFIG_RCU_CPU_STALL_DETECTOR -+ printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n"); -+#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ -+ rcu_cpu_notify(&rcu_nb, CPU_UP_PREPARE, -+ (void *)(long)smp_processor_id()); -+ /* Register notifier for non-boot CPUs */ -+ register_cpu_notifier(&rcu_nb); -+} -+ -+module_param(blimit, int, 0); -+module_param(qhimark, int, 0); -+module_param(qlowmark, int, 0); -diff --git a/libdde-linux26/contrib/kernel/rcupdate.c b/libdde-linux26/contrib/kernel/rcupdate.c -index cae8a05..c6bfa1a 100644 ---- a/libdde-linux26/contrib/kernel/rcupdate.c -+++ b/libdde-linux26/contrib/kernel/rcupdate.c -@@ -180,6 +180,7 @@ void __init rcu_init(void) - { - __rcu_init(); - } -+core_initcall(rcu_init); - - void rcu_scheduler_starting(void) - { -diff --git a/libdde-linux26/lib/src/Makefile b/libdde-linux26/lib/src/Makefile -index 358196b..450c4e6 100644 ---- a/libdde-linux26/lib/src/Makefile -+++ b/libdde-linux26/lib/src/Makefile -@@ -89,6 +89,8 @@ SRC_C_libdde-linux26.o.a += \ - kernel/kthread.c \ - kernel/mutex.c \ - kernel/notifier.c \ -+ kernel/rcupdate.c \ -+ kernel/rcuclassic.c \ - kernel/resource.c \ - kernel/rwsem.c \ - kernel/sched.c \ diff --git a/debian/patches/libdde_rculist.patch b/debian/patches/libdde_rculist.patch deleted file mode 100644 index 3c273a18..00000000 --- a/debian/patches/libdde_rculist.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/libdde-linux26/contrib/include/linux/netdevice.h b/libdde-linux26/contrib/include/linux/netdevice.h -index 6593667..bb4fca1 100644 ---- a/libdde-linux26/contrib/include/linux/netdevice.h -+++ b/libdde-linux26/contrib/include/linux/netdevice.h -@@ -37,6 +37,7 @@ - #include <asm/byteorder.h> - - #include <linux/device.h> -+#include <linux/rculist.h> - #include <linux/percpu.h> - #include <linux/dmaengine.h> - #include <linux/workqueue.h> diff --git a/debian/patches/libdde_rx_queue.patch b/debian/patches/libdde_rx_queue.patch deleted file mode 100644 index 6d880232..00000000 --- a/debian/patches/libdde_rx_queue.patch +++ /dev/null @@ -1,70 +0,0 @@ -commit d5a9e24afb4ab38110ebb777588ea0bd0eacbd0a -Author: David S. Miller <davem@davemloft.net> -Date: Tue Jan 27 16:22:11 2009 -0800 - - net: Allow RX queue selection to seed TX queue hashing. - - The idea is that drivers which implement multiqueue RX - pre-seed the SKB by recording the RX queue selected by - the hardware. - - If such a seed is found on TX, we'll use that to select - the outgoing TX queue. - - This helps get more consistent load balancing on router - and firewall loads. - - Signed-off-by: David S. Miller <davem@davemloft.net> - -Index: hurd-debian/libdde-linux26/contrib/include/linux/skbuff.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/skbuff.h 2012-04-16 00:34:56.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/skbuff.h 2012-04-16 00:35:11.000000000 +0000 -@@ -1903,6 +1903,21 @@ - to->queue_mapping = from->queue_mapping; - } - -+static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue) -+{ -+ skb->queue_mapping = rx_queue + 1; -+} -+ -+static inline u16 skb_get_rx_queue(struct sk_buff *skb) -+{ -+ return skb->queue_mapping - 1; -+} -+ -+static inline bool skb_rx_queue_recorded(struct sk_buff *skb) -+{ -+ return (skb->queue_mapping != 0); -+} -+ - #ifdef CONFIG_XFRM - static inline struct sec_path *skb_sec_path(struct sk_buff *skb) - { -Index: hurd-debian/libdde-linux26/lib/src/net/core/dev.c -=================================================================== ---- hurd-debian.orig/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:34:51.000000000 +0000 -+++ hurd-debian/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:35:11.000000000 +0000 -@@ -1731,6 +1731,13 @@ - simple_tx_hashrnd_initialized = 1; - } - -+ if (skb_rx_queue_recorded(skb)) { -+ u32 val = skb_get_rx_queue(skb); -+ -+ hash = jhash_1word(val, simple_tx_hashrnd); -+ goto out; -+ } -+ - switch (skb->protocol) { - case htons(ETH_P_IP): - if (!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET))) -@@ -1768,6 +1775,7 @@ - - hash = jhash_3words(addr1, addr2, ports, simple_tx_hashrnd); - -+out: - return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); - } - diff --git a/debian/patches/libdde_trans_start.patch b/debian/patches/libdde_trans_start.patch deleted file mode 100644 index 9b0330a7..00000000 --- a/debian/patches/libdde_trans_start.patch +++ /dev/null @@ -1,138 +0,0 @@ -commit 9d21493b4beb8f918ba248032fefa393074a5e2b -Author: Eric Dumazet <dada1@cosmosbay.com> -Date: Sun May 17 20:55:16 2009 -0700 - - net: tx scalability works : trans_start - - struct net_device trans_start field is a hot spot on SMP and high performance - devices, particularly multi queues ones, because every transmitter dirties - it. Is main use is tx watchdog and bonding alive checks. - - But as most devices dont use NETIF_F_LLTX, we have to lock - a netdev_queue before calling their ndo_start_xmit(). So it makes - sense to move trans_start from net_device to netdev_queue. Its update - will occur on a already present (and in exclusive state) cache line, for - free. - - We can do this transition smoothly. An old driver continue to - update dev->trans_start, while an updated one updates txq->trans_start. - - Further patches could also put tx_bytes/tx_packets counters in - netdev_queue to avoid dirtying dev->stats (vlan device comes to mind) - - Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> - Signed-off-by: David S. Miller <davem@davemloft.net> - -Index: hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:34:54.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:35:04.000000000 +0000 -@@ -462,6 +462,10 @@ - spinlock_t _xmit_lock; - int xmit_lock_owner; - struct Qdisc *qdisc_sleeping; -+ /* -+ * please use this field instead of dev->trans_start -+ */ -+ unsigned long trans_start; - } ____cacheline_aligned_in_smp; - - -@@ -801,6 +805,11 @@ - * One part is mostly used on xmit path (device) - */ - /* These may be needed for future network-power-down code. */ -+ -+ /* -+ * trans_start here is expensive for high speed devices on SMP, -+ * please use netdev_queue->trans_start instead. -+ */ - unsigned long trans_start; /* Time (in jiffies) of last Tx */ - - int watchdog_timeo; /* used by dev_watchdog() */ -@@ -1477,6 +1486,8 @@ - return !test_bit(__LINK_STATE_NOCARRIER, &dev->state); - } - -+extern unsigned long dev_trans_start(struct net_device *dev); -+ - extern void __netdev_watchdog_up(struct net_device *dev); - - extern void netif_carrier_on(struct net_device *dev); -Index: hurd-debian/libdde-linux26/lib/src/net/sched/sch_generic.c -=================================================================== ---- hurd-debian.orig/libdde-linux26/lib/src/net/sched/sch_generic.c 2012-04-16 00:26:38.000000000 +0000 -+++ hurd-debian/libdde-linux26/lib/src/net/sched/sch_generic.c 2012-04-16 00:35:04.000000000 +0000 -@@ -200,6 +200,21 @@ - clear_bit(__QDISC_STATE_RUNNING, &q->state); - } - -+unsigned long dev_trans_start(struct net_device *dev) -+{ -+ unsigned long val, res = dev->trans_start; -+ unsigned int i; -+ -+ for (i = 0; i < dev->num_tx_queues; i++) { -+ val = netdev_get_tx_queue(dev, i)->trans_start; -+ if (val && time_after(val, res)) -+ res = val; -+ } -+ dev->trans_start = res; -+ return res; -+} -+EXPORT_SYMBOL(dev_trans_start); -+ - static void dev_watchdog(unsigned long arg) - { - struct net_device *dev = (struct net_device *)arg; -@@ -209,25 +224,30 @@ - if (netif_device_present(dev) && - netif_running(dev) && - netif_carrier_ok(dev)) { -- int some_queue_stopped = 0; -+ int some_queue_timedout = 0; - unsigned int i; -+ unsigned long trans_start; - - for (i = 0; i < dev->num_tx_queues; i++) { - struct netdev_queue *txq; - - txq = netdev_get_tx_queue(dev, i); -- if (netif_tx_queue_stopped(txq)) { -- some_queue_stopped = 1; -+ /* -+ * old device drivers set dev->trans_start -+ */ -+ trans_start = txq->trans_start ? : dev->trans_start; -+ if (netif_tx_queue_stopped(txq) && -+ time_after(jiffies, (trans_start + -+ dev->watchdog_timeo))) { -+ some_queue_timedout = 1; - break; - } - } - -- if (some_queue_stopped && -- time_after(jiffies, (dev->trans_start + -- dev->watchdog_timeo))) { -+ if (some_queue_timedout) { - char drivername[64]; -- WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit timed out\n", -- dev->name, netdev_drivername(dev, drivername, 64)); -+ WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit queue %u timed out\n", -+ dev->name, netdev_drivername(dev, drivername, 64), i); - dev->netdev_ops->ndo_tx_timeout(dev); - } - if (!mod_timer(&dev->watchdog_timer, -@@ -612,8 +632,10 @@ - clear_bit(__QDISC_STATE_DEACTIVATED, &new_qdisc->state); - - rcu_assign_pointer(dev_queue->qdisc, new_qdisc); -- if (need_watchdog_p && new_qdisc != &noqueue_qdisc) -+ if (need_watchdog_p && new_qdisc != &noqueue_qdisc) { -+ dev_queue->trans_start = 0; - *need_watchdog_p = 1; -+ } - } - - void dev_activate(struct net_device *dev) diff --git a/debian/patches/libdde_ucast_list.patch b/debian/patches/libdde_ucast_list.patch deleted file mode 100644 index 85a30735..00000000 --- a/debian/patches/libdde_ucast_list.patch +++ /dev/null @@ -1,488 +0,0 @@ -commit ccffad25b5136958d4769ed6de5e87992dd9c65c -Author: Jiri Pirko <jpirko@redhat.com> -Date: Fri May 22 23:22:17 2009 +0000 - - net: convert unicast addr list - - This patch converts unicast address list to standard list_head using - previously introduced struct netdev_hw_addr. It also relaxes the - locking. Original spinlock (still used for multicast addresses) is not - needed and is no longer used for a protection of this list. All - reading and writing takes place under rtnl (with no changes). - - I also removed a possibility to specify the length of the address - while adding or deleting unicast address. It's always dev->addr_len. - - The convertion touched especially e1000 and ixgbe codes when the - change is not so trivial. - - Signed-off-by: Jiri Pirko <jpirko@redhat.com> - - drivers/net/bnx2.c | 13 +-- - drivers/net/e1000/e1000_main.c | 24 +++-- - drivers/net/ixgbe/ixgbe_common.c | 14 ++-- - drivers/net/ixgbe/ixgbe_common.h | 4 +- - drivers/net/ixgbe/ixgbe_main.c | 6 +- - drivers/net/ixgbe/ixgbe_type.h | 4 +- - drivers/net/macvlan.c | 11 +- - drivers/net/mv643xx_eth.c | 11 +- - drivers/net/niu.c | 7 +- - drivers/net/virtio_net.c | 7 +- - drivers/s390/net/qeth_l2_main.c | 6 +- - drivers/scsi/fcoe/fcoe.c | 16 ++-- - include/linux/netdevice.h | 18 ++-- - net/8021q/vlan.c | 4 +- - net/8021q/vlan_dev.c | 10 +- - net/core/dev.c | 195 +++++++++++++++++++++++++++----------- - net/dsa/slave.c | 10 +- - net/packet/af_packet.c | 4 +- - 18 files changed, 227 insertions(+), 137 deletions(-) - Signed-off-by: David S. Miller <davem@davemloft.net> - -Index: hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h -=================================================================== ---- hurd-debian.orig/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:34:43.000000000 +0000 -+++ hurd-debian/libdde-linux26/contrib/include/linux/netdevice.h 2012-04-16 00:34:46.000000000 +0000 -@@ -215,9 +215,12 @@ - struct list_head list; - unsigned char addr[MAX_ADDR_LEN]; - unsigned char type; --#define NETDEV_HW_ADDR_T_LAN 1 --#define NETDEV_HW_ADDR_T_SAN 2 --#define NETDEV_HW_ADDR_T_SLAVE 3 -+#define NETDEV_HW_ADDR_T_LAN 1 -+#define NETDEV_HW_ADDR_T_SAN 2 -+#define NETDEV_HW_ADDR_T_SLAVE 3 -+#define NETDEV_HW_ADDR_T_UNICAST 4 -+ int refcount; -+ bool synced; - struct rcu_head rcu_head; - }; - -@@ -738,10 +741,11 @@ - unsigned char addr_len; /* hardware address length */ - unsigned short dev_id; /* for shared network cards */ - -- spinlock_t addr_list_lock; -- struct dev_addr_list *uc_list; /* Secondary unicast mac addresses */ -+ struct list_head uc_list; /* Secondary unicast mac -+ addresses */ - int uc_count; /* Number of installed ucasts */ - int uc_promisc; -+ spinlock_t addr_list_lock; - struct dev_addr_list *mc_list; /* Multicast mac addresses */ - int mc_count; /* Number of installed mcasts */ - unsigned int promiscuity; -@@ -1816,8 +1820,8 @@ - /* Functions used for secondary unicast and multicast support */ - extern void dev_set_rx_mode(struct net_device *dev); - extern void __dev_set_rx_mode(struct net_device *dev); --extern int dev_unicast_delete(struct net_device *dev, void *addr, int alen); --extern int dev_unicast_add(struct net_device *dev, void *addr, int alen); -+extern int dev_unicast_delete(struct net_device *dev, void *addr); -+extern int dev_unicast_add(struct net_device *dev, void *addr); - extern int dev_unicast_sync(struct net_device *to, struct net_device *from); - extern void dev_unicast_unsync(struct net_device *to, struct net_device *from); - extern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all); -Index: hurd-debian/libdde-linux26/lib/src/net/core/dev.c -=================================================================== ---- hurd-debian.orig/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:34:43.000000000 +0000 -+++ hurd-debian/libdde-linux26/lib/src/net/core/dev.c 2012-04-16 00:34:46.000000000 +0000 -@@ -3399,8 +3399,9 @@ - - /* hw addresses list handling functions */ - --static int __hw_addr_add(struct list_head *list, unsigned char *addr, -- int addr_len, unsigned char addr_type) -+static int __hw_addr_add(struct list_head *list, int *delta, -+ unsigned char *addr, int addr_len, -+ unsigned char addr_type) - { - struct netdev_hw_addr *ha; - int alloc_size; -@@ -3408,6 +3409,15 @@ - if (addr_len > MAX_ADDR_LEN) - return -EINVAL; - -+ list_for_each_entry(ha, list, list) { -+ if (!memcmp(ha->addr, addr, addr_len) && -+ ha->type == addr_type) { -+ ha->refcount++; -+ return 0; -+ } -+ } -+ -+ - alloc_size = sizeof(*ha); - if (alloc_size < L1_CACHE_BYTES) - alloc_size = L1_CACHE_BYTES; -@@ -3416,7 +3426,11 @@ - return -ENOMEM; - memcpy(ha->addr, addr, addr_len); - ha->type = addr_type; -+ ha->refcount = 1; -+ ha->synced = false; - list_add_tail_rcu(&ha->list, list); -+ if (delta) -+ (*delta)++; - return 0; - } - -@@ -3428,29 +3442,30 @@ - kfree(ha); - } - --static int __hw_addr_del_ii(struct list_head *list, unsigned char *addr, -- int addr_len, unsigned char addr_type, -- int ignore_index) -+static int __hw_addr_del(struct list_head *list, int *delta, -+ unsigned char *addr, int addr_len, -+ unsigned char addr_type) - { - struct netdev_hw_addr *ha; -- int i = 0; - - list_for_each_entry(ha, list, list) { -- if (i++ != ignore_index && -- !memcmp(ha->addr, addr, addr_len) && -+ if (!memcmp(ha->addr, addr, addr_len) && - (ha->type == addr_type || !addr_type)) { -+ if (--ha->refcount) -+ return 0; - list_del_rcu(&ha->list); - call_rcu(&ha->rcu_head, ha_rcu_free); -+ if (delta) -+ (*delta)--; - return 0; - } - } - return -ENOENT; - } - --static int __hw_addr_add_multiple_ii(struct list_head *to_list, -- struct list_head *from_list, -- int addr_len, unsigned char addr_type, -- int ignore_index) -+static int __hw_addr_add_multiple(struct list_head *to_list, int *to_delta, -+ struct list_head *from_list, int addr_len, -+ unsigned char addr_type) - { - int err; - struct netdev_hw_addr *ha, *ha2; -@@ -3458,7 +3473,8 @@ - - list_for_each_entry(ha, from_list, list) { - type = addr_type ? addr_type : ha->type; -- err = __hw_addr_add(to_list, ha->addr, addr_len, type); -+ err = __hw_addr_add(to_list, to_delta, ha->addr, -+ addr_len, type); - if (err) - goto unroll; - } -@@ -3469,27 +3485,69 @@ - if (ha2 == ha) - break; - type = addr_type ? addr_type : ha2->type; -- __hw_addr_del_ii(to_list, ha2->addr, addr_len, type, -- ignore_index); -+ __hw_addr_del(to_list, to_delta, ha2->addr, -+ addr_len, type); - } - return err; - } - --static void __hw_addr_del_multiple_ii(struct list_head *to_list, -- struct list_head *from_list, -- int addr_len, unsigned char addr_type, -- int ignore_index) -+static void __hw_addr_del_multiple(struct list_head *to_list, int *to_delta, -+ struct list_head *from_list, int addr_len, -+ unsigned char addr_type) - { - struct netdev_hw_addr *ha; - unsigned char type; - - list_for_each_entry(ha, from_list, list) { - type = addr_type ? addr_type : ha->type; -- __hw_addr_del_ii(to_list, ha->addr, addr_len, addr_type, -- ignore_index); -+ __hw_addr_del(to_list, to_delta, ha->addr, -+ addr_len, addr_type); - } - } - -+static int __hw_addr_sync(struct list_head *to_list, int *to_delta, -+ struct list_head *from_list, int *from_delta, -+ int addr_len) -+{ -+ int err = 0; -+ struct netdev_hw_addr *ha, *tmp; -+ -+ list_for_each_entry_safe(ha, tmp, from_list, list) { -+ if (!ha->synced) { -+ err = __hw_addr_add(to_list, to_delta, ha->addr, -+ addr_len, ha->type); -+ if (err) -+ break; -+ ha->synced = true; -+ ha->refcount++; -+ } else if (ha->refcount == 1) { -+ __hw_addr_del(to_list, to_delta, ha->addr, -+ addr_len, ha->type); -+ __hw_addr_del(from_list, from_delta, ha->addr, -+ addr_len, ha->type); -+ } -+ } -+ return err; -+} -+ -+static void __hw_addr_unsync(struct list_head *to_list, int *to_delta, -+ struct list_head *from_list, int *from_delta, -+ int addr_len) -+{ -+ struct netdev_hw_addr *ha, *tmp; -+ -+ list_for_each_entry_safe(ha, tmp, from_list, list) { -+ if (ha->synced) { -+ __hw_addr_del(to_list, to_delta, ha->addr, -+ addr_len, ha->type); -+ ha->synced = false; -+ __hw_addr_del(from_list, from_delta, ha->addr, -+ addr_len, ha->type); -+ } -+ } -+} -+ -+ - static void __hw_addr_flush(struct list_head *list) - { - struct netdev_hw_addr *ha, *tmp; -@@ -3520,7 +3578,7 @@ - - INIT_LIST_HEAD(&dev->dev_addr_list); - memset(addr, 0, sizeof(*addr)); -- err = __hw_addr_add(&dev->dev_addr_list, addr, sizeof(*addr), -+ err = __hw_addr_add(&dev->dev_addr_list, NULL, addr, sizeof(*addr), - NETDEV_HW_ADDR_T_LAN); - if (!err) { - /* -@@ -3552,7 +3610,7 @@ - - ASSERT_RTNL(); - -- err = __hw_addr_add(&dev->dev_addr_list, addr, dev->addr_len, -+ err = __hw_addr_add(&dev->dev_addr_list, NULL, addr, dev->addr_len, - addr_type); - if (!err) - call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); -@@ -3575,11 +3633,20 @@ - unsigned char addr_type) - { - int err; -+ struct netdev_hw_addr *ha; - - ASSERT_RTNL(); - -- err = __hw_addr_del_ii(&dev->dev_addr_list, addr, dev->addr_len, -- addr_type, 0); -+ /* -+ * We can not remove the first address from the list because -+ * dev->dev_addr points to that. -+ */ -+ ha = list_first_entry(&dev->dev_addr_list, struct netdev_hw_addr, list); -+ if (ha->addr == dev->dev_addr && ha->refcount == 1) -+ return -ENOENT; -+ -+ err = __hw_addr_del(&dev->dev_addr_list, NULL, addr, dev->addr_len, -+ addr_type); - if (!err) - call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); - return err; -@@ -3606,9 +3673,9 @@ - - if (from_dev->addr_len != to_dev->addr_len) - return -EINVAL; -- err = __hw_addr_add_multiple_ii(&to_dev->dev_addr_list, -- &from_dev->dev_addr_list, -- to_dev->addr_len, addr_type, 0); -+ err = __hw_addr_add_multiple(&to_dev->dev_addr_list, NULL, -+ &from_dev->dev_addr_list, -+ to_dev->addr_len, addr_type); - if (!err) - call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); - return err; -@@ -3633,9 +3700,9 @@ - - if (from_dev->addr_len != to_dev->addr_len) - return -EINVAL; -- __hw_addr_del_multiple_ii(&to_dev->dev_addr_list, -- &from_dev->dev_addr_list, -- to_dev->addr_len, addr_type, 0); -+ __hw_addr_del_multiple(&to_dev->dev_addr_list, NULL, -+ &from_dev->dev_addr_list, -+ to_dev->addr_len, addr_type); - call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); - return 0; - } -@@ -3705,24 +3772,22 @@ - * dev_unicast_delete - Release secondary unicast address. - * @dev: device - * @addr: address to delete -- * @alen: length of @addr - * - * Release reference to a secondary unicast address and remove it - * from the device if the reference count drops to zero. - * - * The caller must hold the rtnl_mutex. - */ --int dev_unicast_delete(struct net_device *dev, void *addr, int alen) -+int dev_unicast_delete(struct net_device *dev, void *addr) - { - int err; - - ASSERT_RTNL(); - -- netif_addr_lock_bh(dev); -- err = __dev_addr_delete(&dev->uc_list, &dev->uc_count, addr, alen, 0); -+ err = __hw_addr_del(&dev->uc_list, &dev->uc_count, addr, -+ dev->addr_len, NETDEV_HW_ADDR_T_UNICAST); - if (!err) - __dev_set_rx_mode(dev); -- netif_addr_unlock_bh(dev); - return err; - } - EXPORT_SYMBOL(dev_unicast_delete); -@@ -3731,24 +3796,22 @@ - * dev_unicast_add - add a secondary unicast address - * @dev: device - * @addr: address to add -- * @alen: length of @addr - * - * Add a secondary unicast address to the device or increase - * the reference count if it already exists. - * - * The caller must hold the rtnl_mutex. - */ --int dev_unicast_add(struct net_device *dev, void *addr, int alen) -+int dev_unicast_add(struct net_device *dev, void *addr) - { - int err; - - ASSERT_RTNL(); - -- netif_addr_lock_bh(dev); -- err = __dev_addr_add(&dev->uc_list, &dev->uc_count, addr, alen, 0); -+ err = __hw_addr_add(&dev->uc_list, &dev->uc_count, addr, -+ dev->addr_len, NETDEV_HW_ADDR_T_UNICAST); - if (!err) - __dev_set_rx_mode(dev); -- netif_addr_unlock_bh(dev); - return err; - } - EXPORT_SYMBOL(dev_unicast_add); -@@ -3805,8 +3868,7 @@ - * @from: source device - * - * Add newly added addresses to the destination device and release -- * addresses that have no users left. The source device must be -- * locked by netif_addr_lock_bh. -+ * addresses that have no users left. - * - * This function is intended to be called from the dev->set_rx_mode - * function of layered software devices. -@@ -3815,12 +3877,15 @@ - { - int err = 0; - -- netif_addr_lock_bh(to); -- err = __dev_addr_sync(&to->uc_list, &to->uc_count, -- &from->uc_list, &from->uc_count); -+ ASSERT_RTNL(); -+ -+ if (to->addr_len != from->addr_len) -+ return -EINVAL; -+ -+ err = __hw_addr_sync(&to->uc_list, &to->uc_count, -+ &from->uc_list, &from->uc_count, to->addr_len); - if (!err) - __dev_set_rx_mode(to); -- netif_addr_unlock_bh(to); - return err; - } - EXPORT_SYMBOL(dev_unicast_sync); -@@ -3836,18 +3901,33 @@ - */ - void dev_unicast_unsync(struct net_device *to, struct net_device *from) - { -- netif_addr_lock_bh(from); -- netif_addr_lock(to); -+ ASSERT_RTNL(); - -- __dev_addr_unsync(&to->uc_list, &to->uc_count, -- &from->uc_list, &from->uc_count); -- __dev_set_rx_mode(to); -+ if (to->addr_len != from->addr_len) -+ return; - -- netif_addr_unlock(to); -- netif_addr_unlock_bh(from); -+ __hw_addr_unsync(&to->uc_list, &to->uc_count, -+ &from->uc_list, &from->uc_count, to->addr_len); -+ __dev_set_rx_mode(to); - } - EXPORT_SYMBOL(dev_unicast_unsync); - -+static void dev_unicast_flush(struct net_device *dev) -+{ -+ /* rtnl_mutex must be held here */ -+ -+ __hw_addr_flush(&dev->uc_list); -+ dev->uc_count = 0; -+} -+ -+static void dev_unicast_init(struct net_device *dev) -+{ -+ /* rtnl_mutex must be held here */ -+ -+ INIT_LIST_HEAD(&dev->uc_list); -+} -+ -+ - static void __dev_addr_discard(struct dev_addr_list **list) - { - struct dev_addr_list *tmp; -@@ -3866,9 +3946,6 @@ - { - netif_addr_lock_bh(dev); - -- __dev_addr_discard(&dev->uc_list); -- dev->uc_count = 0; -- - __dev_addr_discard(&dev->mc_list); - dev->mc_count = 0; - -@@ -4459,6 +4536,7 @@ - /* - * Flush the unicast and multicast chains - */ -+ dev_unicast_flush(dev); - dev_addr_discard(dev); - - if (dev->netdev_ops->ndo_uninit) -@@ -4975,6 +5053,8 @@ - dev = (struct net_device *) - (((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST); - dev->padded = (char *)dev - (char *)p; -+ dev_unicast_init(dev); -+ - dev_net_set(dev, &init_net); - - dev->_tx = tx; -@@ -5173,6 +5253,7 @@ - /* - * Flush the unicast and multicast chains - */ -+ dev_unicast_flush(dev); - dev_addr_discard(dev); - - netdev_unregister_kobject(dev); diff --git a/debian/patches/libdde_workqueue.patch b/debian/patches/libdde_workqueue.patch deleted file mode 100644 index 35082e45..00000000 --- a/debian/patches/libdde_workqueue.patch +++ /dev/null @@ -1,55 +0,0 @@ -diff --git a/libdde-linux26/contrib/include/linux/workqueue.h b/libdde-linux26/contrib/include/linux/workqueue.h -index 3cd51e5..cf24c20 100644 ---- a/libdde-linux26/contrib/include/linux/workqueue.h -+++ b/libdde-linux26/contrib/include/linux/workqueue.h -@@ -41,6 +41,11 @@ struct delayed_work { - struct timer_list timer; - }; - -+static inline struct delayed_work *to_delayed_work(struct work_struct *work) -+{ -+ return container_of(work, struct delayed_work, work); -+} -+ - struct execute_work { - struct work_struct work; - }; -@@ -89,7 +94,7 @@ struct execute_work { - /* - * initialize all of a work item in one go - * -- * NOTE! No point in using "atomic_long_set()": useing a direct -+ * NOTE! No point in using "atomic_long_set()": using a direct - * assignment of the work data initializer allows the compiler - * to generate better code. - */ -@@ -202,6 +207,7 @@ - - extern void flush_workqueue(struct workqueue_struct *wq); - extern void flush_scheduled_work(void); -+extern void flush_delayed_work(struct delayed_work *work); - - extern int schedule_work(struct work_struct *work); - extern int schedule_work_on(int cpu, struct work_struct *work); -@@ -233,6 +239,21 @@ - if (ret) - work_clear_pending(&work->work); - return ret; -+} -+ -+/* -+ * Like above, but uses del_timer() instead of del_timer_sync(). This means, -+ * if it returns 0 the timer function may be running and the queueing is in -+ * progress. -+ */ -+static inline int __cancel_delayed_work(struct delayed_work *work) -+{ -+ int ret; -+ -+ ret = del_timer(&work->timer); -+ if (ret) -+ work_clear_pending(&work->work); -+ return ret; - } - - extern int cancel_delayed_work_sync(struct delayed_work *work); diff --git a/debian/patches/series b/debian/patches/series index 829913bf..f245822c 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,42 +1,25 @@ -mach-defpager-dl.patch -libexec.patch - diskfs_no_inherit_dir_group.patch +init_try_runsystem.gnu.patch makedev.diff +rc.patch startup-usr-support.patch tmp_exec_startup.patch uptime_w_path_fix.patch stat_round.patch - external.patch - console_ignore_bdf_err.patch posix-sigcodes.patch random-default-fast.patch - - -libdde_netdev_tx_t.patch -libdde_pci-needs_freset.patch -libdde_addr_list.patch -libdde_ucast_list.patch -libdde_addr_fix.patch -libdde_group_addr.patch -libdde_rculist.patch -libdde_dma_head.patch -libdde_mdio.patch -libdde_ethoc.patch -libdde_phy.patch -libdde_pci_ids.h.patch -libdde_ethtool.patch -libdde_workqueue.patch -libdde_trans_start.patch -libdde_devres.patch -libdde_pr_cont.patch -libdde_rx_queue.patch -libdde_rcu.patch +libexec.patch +run.patch mount.patch -format +MAKEDEV-apm.patch +term-for-tcl.patch +newRPC.patch +dl_origin.patch +mach-defpager-dl.patch +format #trans-crash-add-verbose.patch @@ -78,10 +61,3 @@ introspection0012-fixup_libintrospection.patch ihash-as-cache0001-libihash-add-hurd_ihash_value_valid.patch ihash-as-cache0002-libihash-optimize-lookup-or-insert-operations.patch ihash-as-cache0003-libihash-prefer-performance-degradation-over-failure.patch -dl_origin.patch -init_try_runsystem.gnu.patch -newRPC.patch -rc.patch -run.patch -term-for-tcl.patch -MAKEDEV-apm.patch diff --git a/devnode/devnode.c b/devnode/devnode.c index 317a70b1..6ec8a654 100644 --- a/devnode/devnode.c +++ b/devnode/devnode.c @@ -137,27 +137,6 @@ do_mach_notify_dead_name (struct port_info *pi, } /* Implementation of device interface */ -kern_return_t -ds_xxx_device_set_status (device_t device, dev_flavor_t flavor, - dev_status_t status, size_t statu_cnt) -{ - return D_INVALID_OPERATION; -} - -kern_return_t -ds_xxx_device_get_status (device_t device, dev_flavor_t flavor, - dev_status_t status, size_t *statuscnt) -{ - return D_INVALID_OPERATION; -} - -kern_return_t -ds_xxx_device_set_filter (device_t device, mach_port_t rec, - int pri, filter_array_t filt, size_t len) -{ - return D_INVALID_OPERATION; -} - kern_return_t ds_device_open (mach_port_t master_port, mach_port_t reply_port, mach_msg_type_name_t reply_portPoly, @@ -301,7 +280,7 @@ trivfs_goaway (struct trivfs_control *fsys, int flags) /* We won't go away, so start things going again... */ ports_enable_class (trivfs_protid_class); ports_resume_class_rpcs (trivfs_cntl_class); - ports_resume_class_rpcs (trivfs_protid_class); + ports_resume_class_rpcs (trivfs_protid_class); return EBUSY; } diff --git a/eth-filter/filter.c b/eth-filter/filter.c index 58fcd65d..74a1e867 100644 --- a/eth-filter/filter.c +++ b/eth-filter/filter.c @@ -294,27 +294,6 @@ do_mach_notify_dead_name (struct port_info *pi, } /* Implementation of device interface */ -kern_return_t -ds_xxx_device_set_status (struct proxy_user *device, dev_flavor_t flavor, - dev_status_t status, size_t statu_cnt) -{ - return D_INVALID_OPERATION; -} - -kern_return_t -ds_xxx_device_get_status (struct proxy_user *device, dev_flavor_t flavor, - dev_status_t status, size_t *statuscnt) -{ - return D_INVALID_OPERATION; -} - -kern_return_t -ds_xxx_device_set_filter (struct proxy_user *device, mach_port_t rec, - int pri, filter_array_t filt, size_t len) -{ - return D_INVALID_OPERATION; -} - kern_return_t ds_device_open (mach_port_t master_port, mach_port_t reply_port, mach_msg_type_name_t reply_portPoly, @@ -593,7 +572,7 @@ trivfs_goaway (struct trivfs_control *fsys, int flags) /* We won't go away, so start things going again... */ ports_enable_class (trivfs_protid_class); ports_resume_class_rpcs (trivfs_cntl_class); - ports_resume_class_rpcs (trivfs_protid_class); + ports_resume_class_rpcs (trivfs_protid_class); return EBUSY; } diff --git a/eth-multiplexer/device_impl.c b/eth-multiplexer/device_impl.c index 35a4da44..7d82b8d9 100644 --- a/eth-multiplexer/device_impl.c +++ b/eth-multiplexer/device_impl.c @@ -39,32 +39,6 @@ extern struct port_class *other_portclass; extern struct port_info *notify_pi; /* Implementation of device interface */ -kern_return_t -ds_xxx_device_set_status (struct vether_device *vdev, dev_flavor_t flavor, - dev_status_t status, size_t statu_cnt) -{ - if (vdev == NULL) - return D_NO_SUCH_DEVICE; - return D_INVALID_OPERATION; -} - -kern_return_t -ds_xxx_device_get_status (struct vether_device *vdev, dev_flavor_t flavor, - dev_status_t status, size_t *statuscnt) -{ - if (vdev == NULL) - return D_NO_SUCH_DEVICE; - return D_INVALID_OPERATION; -} - -kern_return_t -ds_xxx_device_set_filter (struct vether_device *vdev, mach_port_t rec, - int pri, filter_array_t filt, size_t len) -{ - if (vdev == NULL) - return D_NO_SUCH_DEVICE; - return D_INVALID_OPERATION; -} /* * This function is currently running in the multithread environment, diff --git a/libbpf/Makefile b/libbpf/Makefile index ec0723c9..d6ebdc3d 100644 --- a/libbpf/Makefile +++ b/libbpf/Makefile @@ -21,7 +21,7 @@ makemode := library libname = libbpf SRCS= bpf_impl.c queue.c LCLHDRS = bpf_impl.h queue.h -installhdrs = bpf_impl.h +installhdrs = bpf_impl.h queue.h MIGSTUBS = OBJS = $(sort $(SRCS:.c=.o) $(MIGSTUBS)) diff --git a/libdde-linux26/contrib/drivers/base/attribute_container.c b/libdde-linux26/contrib/drivers/base/attribute_container.c index b9cda053..e0f7859f 100644 --- a/libdde-linux26/contrib/drivers/base/attribute_container.c +++ b/libdde-linux26/contrib/drivers/base/attribute_container.c @@ -167,7 +167,7 @@ attribute_container_add_device(struct device *dev, ic->classdev.parent = get_device(dev); ic->classdev.class = cont->class; cont->class->dev_release = attribute_container_release; - dev_set_name(&ic->classdev, dev_name(dev)); + dev_set_name(&ic->classdev, "%s", dev_name(dev)); if (fn) fn(cont, dev, &ic->classdev); else diff --git a/libdde-linux26/contrib/drivers/base/platform.c b/libdde-linux26/contrib/drivers/base/platform.c index 349a1013..030d638c 100644 --- a/libdde-linux26/contrib/drivers/base/platform.c +++ b/libdde-linux26/contrib/drivers/base/platform.c @@ -244,7 +244,7 @@ int platform_device_add(struct platform_device *pdev) if (pdev->id != -1) dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id); else - dev_set_name(&pdev->dev, pdev->name); + dev_set_name(&pdev->dev, "%s", pdev->name); for (i = 0; i < pdev->num_resources; i++) { struct resource *p, *r = &pdev->resource[i]; diff --git a/libdde-linux26/contrib/drivers/base/sys.c b/libdde-linux26/contrib/drivers/base/sys.c index b428c8c4..38e725c1 100644 --- a/libdde-linux26/contrib/drivers/base/sys.c +++ b/libdde-linux26/contrib/drivers/base/sys.c @@ -137,7 +137,7 @@ int sysdev_class_register(struct sysdev_class * cls) cls->kset.kobj.parent = &system_kset->kobj; cls->kset.kobj.ktype = &ktype_sysdev_class; cls->kset.kobj.kset = system_kset; - kobject_set_name(&cls->kset.kobj, cls->name); + kobject_set_name(&cls->kset.kobj, "%s", cls->name); return kset_register(&cls->kset); } diff --git a/libdde-linux26/contrib/include/linux/compiler-gcc5.h b/libdde-linux26/contrib/include/linux/compiler-gcc5.h index 00cb5759..34c58615 100644 --- a/libdde-linux26/contrib/include/linux/compiler-gcc5.h +++ b/libdde-linux26/contrib/include/linux/compiler-gcc5.h @@ -2,9 +2,10 @@ #error "Please don't include <linux/compiler-gcc5.h> directly, include <linux/compiler.h> instead." #endif -#define __used __attribute__((__used__)) -#define __must_check __attribute__((warn_unused_result)) -#define __compiler_offsetof(a, b) __builtin_offsetof(a, b) +#define __used __attribute__((__used__)) +#define __must_check __attribute__((warn_unused_result)) +#define __compiler_offsetof(a,b) __builtin_offsetof(a,b) +#define __always_inline inline __attribute__((always_inline)) /* * A trick to suppress uninitialized variable warning without generating any @@ -18,56 +19,7 @@ like BUG(), printk(), panic() etc. [but let's keep them for now for older compilers] - Early snapshots of gcc 4.3 don't support this and we can't detect this - in the preprocessor, but we can live with this because they're unreleased. - Maketime probing would be overkill here. - gcc also has a __attribute__((__hot__)) to move hot functions into a special section, but I don't see any sense in this right now in the kernel context */ #define __cold __attribute__((__cold__)) - -#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) - -#ifndef __CHECKER__ -# define __compiletime_warning(message) __attribute__((warning(message))) -# define __compiletime_error(message) __attribute__((error(message))) -#endif /* __CHECKER__ */ - -/* - * Mark a position in code as unreachable. This can be used to - * suppress control flow warnings after asm blocks that transfer - * control elsewhere. - * - * Early snapshots of gcc 4.5 don't support this and we can't detect - * this in the preprocessor, but we can live with this because they're - * unreleased. Really, we need to have autoconf for the kernel. - */ -#define unreachable() __builtin_unreachable() - -/* Mark a function definition as prohibited from being cloned. */ -#define __noclone __attribute__((__noclone__)) - -/* - * Tell the optimizer that something else uses this function or variable. - */ -#define __visible __attribute__((externally_visible)) - -/* - * GCC 'asm goto' miscompiles certain code sequences: - * - * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 - * - * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. - * - * (asm goto is automatically volatile - the naming reflects this.) - */ -#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) - -#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP -#define __HAVE_BUILTIN_BSWAP32__ -#define __HAVE_BUILTIN_BSWAP64__ -#define __HAVE_BUILTIN_BSWAP16__ -#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ - -#define KASAN_ABI_VERSION 4 diff --git a/libdde-linux26/contrib/include/linux/etherdevice.h b/libdde-linux26/contrib/include/linux/etherdevice.h index 1cb0f0b9..fbb3836e 100644 --- a/libdde-linux26/contrib/include/linux/etherdevice.h +++ b/libdde-linux26/contrib/include/linux/etherdevice.h @@ -182,6 +182,33 @@ static inline unsigned compare_ether_addr_64bits(const u8 addr1[6+2], return compare_ether_addr(addr1, addr2); #endif } + +/** + * is_etherdev_addr - Tell if given Ethernet address belongs to the device. + * @dev: Pointer to a device structure + * @addr: Pointer to a six-byte array containing the Ethernet address + * + * Compare passed address with all addresses of the device. Return true if the + * address if one of the device addresses. + * + * Note that this function calls compare_ether_addr_64bits() so take care of + * the right padding. + */ +static inline bool is_etherdev_addr(const struct net_device *dev, + const u8 addr[6 + 2]) +{ + struct netdev_hw_addr *ha; + int res = 1; + + rcu_read_lock(); + for_each_dev_addr(dev, ha) { + res = compare_ether_addr_64bits(addr, ha->addr); + if (!res) + break; + } + rcu_read_unlock(); + return !res; +} #endif /* __KERNEL__ */ #endif /* _LINUX_ETHERDEVICE_H */ diff --git a/libdde-linux26/contrib/include/linux/ethtool.h b/libdde-linux26/contrib/include/linux/ethtool.h index 27c67a54..45f34dcc 100644 --- a/libdde-linux26/contrib/include/linux/ethtool.h +++ b/libdde-linux26/contrib/include/linux/ethtool.h @@ -25,11 +25,14 @@ struct ethtool_cmd { __u8 phy_address; __u8 transceiver; /* Which transceiver to use */ __u8 autoneg; /* Enable or disable autonegotiation */ + __u8 mdio_support; __u32 maxtxpkt; /* Tx pkts before generating tx int */ __u32 maxrxpkt; /* Rx pkts before generating rx int */ __u16 speed_hi; - __u16 reserved2; - __u32 reserved[3]; + __u8 eth_tp_mdix; + __u8 reserved2; + __u32 lp_advertising; /* Features the link partner advertises */ + __u32 reserved[2]; }; static inline void ethtool_cmd_speed_set(struct ethtool_cmd *ep, @@ -469,6 +472,13 @@ struct ethtool_ops { #define ETHTOOL_SRXFH 0x0000002a /* Set RX flow hash configuration */ #define ETHTOOL_GGRO 0x0000002b /* Get GRO enable (ethtool_value) */ #define ETHTOOL_SGRO 0x0000002c /* Set GRO enable (ethtool_value) */ +#define ETHTOOL_GRXRINGS 0x0000002d /* Get RX rings available for LB */ +#define ETHTOOL_GRXCLSRLCNT 0x0000002e /* Get RX class rule count */ +#define ETHTOOL_GRXCLSRULE 0x0000002f /* Get RX classification rule */ +#define ETHTOOL_GRXCLSRLALL 0x00000030 /* Get all RX classification rule */ +#define ETHTOOL_SRXCLSRLDEL 0x00000031 /* Delete RX classification rule */ +#define ETHTOOL_SRXCLSRLINS 0x00000032 /* Insert RX classification rule */ +#define ETHTOOL_FLASHDEV 0x00000033 /* Flash firmware to device */ /* compatibility with older code */ #define SPARC_ETH_GSET ETHTOOL_GSET @@ -491,6 +501,11 @@ struct ethtool_ops { #define SUPPORTED_Pause (1 << 13) #define SUPPORTED_Asym_Pause (1 << 14) #define SUPPORTED_2500baseX_Full (1 << 15) +#define SUPPORTED_Backplane (1 << 16) +#define SUPPORTED_1000baseKX_Full (1 << 17) +#define SUPPORTED_10000baseKX4_Full (1 << 18) +#define SUPPORTED_10000baseKR_Full (1 << 19) +#define SUPPORTED_10000baseR_FEC (1 << 20) /* Indicates what features are advertised by the interface. */ #define ADVERTISED_10baseT_Half (1 << 0) @@ -509,6 +524,11 @@ struct ethtool_ops { #define ADVERTISED_Pause (1 << 13) #define ADVERTISED_Asym_Pause (1 << 14) #define ADVERTISED_2500baseX_Full (1 << 15) +#define ADVERTISED_Backplane (1 << 16) +#define ADVERTISED_1000baseKX_Full (1 << 17) +#define ADVERTISED_10000baseKX4_Full (1 << 18) +#define ADVERTISED_10000baseKR_Full (1 << 19) +#define ADVERTISED_10000baseR_FEC (1 << 20) /* The following are all involved in forcing a particular link * mode for the device for setting things. When getting the @@ -533,6 +553,7 @@ struct ethtool_ops { #define PORT_MII 0x02 #define PORT_FIBRE 0x03 #define PORT_BNC 0x04 +#define PORT_OTHER 0xff /* Which transceiver to use. */ #define XCVR_INTERNAL 0x00 @@ -547,6 +568,11 @@ struct ethtool_ops { #define AUTONEG_DISABLE 0x00 #define AUTONEG_ENABLE 0x01 +/* Mode MDI or MDI-X */ +#define ETH_TP_MDI_INVALID 0x00 +#define ETH_TP_MDI 0x01 +#define ETH_TP_MDI_X 0x02 + /* Wake-On-Lan options. */ #define WAKE_PHY (1 << 0) #define WAKE_UCAST (1 << 1) @@ -565,6 +591,11 @@ struct ethtool_ops { #define UDP_V6_FLOW 0x06 #define SCTP_V6_FLOW 0x07 #define AH_ESP_V6_FLOW 0x08 +#define AH_V4_FLOW 0x09 +#define ESP_V4_FLOW 0x0a +#define AH_V6_FLOW 0x0b +#define ESP_V6_FLOW 0x0c +#define IP_USER_FLOW 0x0d /* L3-L4 network traffic flow hash options */ #define RXH_DEV_PORT (1 << 0) @@ -577,5 +608,6 @@ struct ethtool_ops { #define RXH_L4_B_2_3 (1 << 7) /* dst port in case of TCP/UDP/SCTP */ #define RXH_DISCARD (1 << 31) +#define RX_CLS_FLOW_DISC 0xffffffffffffffffULL #endif /* _LINUX_ETHTOOL_H */ diff --git a/libdde-linux26/contrib/include/linux/inotify.h b/libdde-linux26/contrib/include/linux/inotify.h index 37ea2894..782fd29a 100644 --- a/libdde-linux26/contrib/include/linux/inotify.h +++ b/libdde-linux26/contrib/include/linux/inotify.h @@ -230,12 +230,12 @@ static inline void put_inotify_watch(struct inotify_watch *watch) { } -extern inline int pin_inotify_watch(struct inotify_watch *watch) +static inline int pin_inotify_watch(struct inotify_watch *watch) { return 0; } -extern inline void unpin_inotify_watch(struct inotify_watch *watch) +static inline void unpin_inotify_watch(struct inotify_watch *watch) { } diff --git a/libdde-linux26/contrib/include/linux/kernel.h b/libdde-linux26/contrib/include/linux/kernel.h index 7fa37189..0bded10b 100644 --- a/libdde-linux26/contrib/include/linux/kernel.h +++ b/libdde-linux26/contrib/include/linux/kernel.h @@ -353,6 +353,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte) printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) #define pr_info(fmt, ...) \ printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) +#define pr_cont(fmt, ...) \ + printk(KERN_CONT fmt, ##__VA_ARGS__) /* If you are writing a driver, please use dev_dbg instead */ #if defined(DEBUG) diff --git a/libdde-linux26/contrib/include/linux/mdio.h b/libdde-linux26/contrib/include/linux/mdio.h new file mode 100644 index 00000000..c779b49a --- /dev/null +++ b/libdde-linux26/contrib/include/linux/mdio.h @@ -0,0 +1,356 @@ +/* + * linux/mdio.h: definitions for MDIO (clause 45) transceivers + * Copyright 2006-2009 Solarflare Communications Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published + * by the Free Software Foundation, incorporated herein by reference. + */ + +#ifndef __LINUX_MDIO_H__ +#define __LINUX_MDIO_H__ + +#include <linux/mii.h> + +/* MDIO Manageable Devices (MMDs). */ +#define MDIO_MMD_PMAPMD 1 /* Physical Medium Attachment/ + * Physical Medium Dependent */ +#define MDIO_MMD_WIS 2 /* WAN Interface Sublayer */ +#define MDIO_MMD_PCS 3 /* Physical Coding Sublayer */ +#define MDIO_MMD_PHYXS 4 /* PHY Extender Sublayer */ +#define MDIO_MMD_DTEXS 5 /* DTE Extender Sublayer */ +#define MDIO_MMD_TC 6 /* Transmission Convergence */ +#define MDIO_MMD_AN 7 /* Auto-Negotiation */ +#define MDIO_MMD_C22EXT 29 /* Clause 22 extension */ +#define MDIO_MMD_VEND1 30 /* Vendor specific 1 */ +#define MDIO_MMD_VEND2 31 /* Vendor specific 2 */ + +/* Generic MDIO registers. */ +#define MDIO_CTRL1 MII_BMCR +#define MDIO_STAT1 MII_BMSR +#define MDIO_DEVID1 MII_PHYSID1 +#define MDIO_DEVID2 MII_PHYSID2 +#define MDIO_SPEED 4 /* Speed ability */ +#define MDIO_DEVS1 5 /* Devices in package */ +#define MDIO_DEVS2 6 +#define MDIO_CTRL2 7 /* 10G control 2 */ +#define MDIO_STAT2 8 /* 10G status 2 */ +#define MDIO_PMA_TXDIS 9 /* 10G PMA/PMD transmit disable */ +#define MDIO_PMA_RXDET 10 /* 10G PMA/PMD receive signal detect */ +#define MDIO_PMA_EXTABLE 11 /* 10G PMA/PMD extended ability */ +#define MDIO_PKGID1 14 /* Package identifier */ +#define MDIO_PKGID2 15 +#define MDIO_AN_ADVERTISE 16 /* AN advertising (base page) */ +#define MDIO_AN_LPA 19 /* AN LP abilities (base page) */ +#define MDIO_PHYXS_LNSTAT 24 /* PHY XGXS lane state */ + +/* Media-dependent registers. */ +#define MDIO_PMA_10GBT_SWAPPOL 130 /* 10GBASE-T pair swap & polarity */ +#define MDIO_PMA_10GBT_TXPWR 131 /* 10GBASE-T TX power control */ +#define MDIO_PMA_10GBT_SNR 133 /* 10GBASE-T SNR margin, lane A. + * Lanes B-D are numbered 134-136. */ +#define MDIO_PMA_10GBR_FECABLE 170 /* 10GBASE-R FEC ability */ +#define MDIO_PCS_10GBX_STAT1 24 /* 10GBASE-X PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT1 32 /* 10GBASE-R/-T PCS status 1 */ +#define MDIO_PCS_10GBRT_STAT2 33 /* 10GBASE-R/-T PCS status 2 */ +#define MDIO_AN_10GBT_CTRL 32 /* 10GBASE-T auto-negotiation control */ +#define MDIO_AN_10GBT_STAT 33 /* 10GBASE-T auto-negotiation status */ + +/* LASI (Link Alarm Status Interrupt) registers, defined by XENPAK MSA. */ +#define MDIO_PMA_LASI_RXCTRL 0x9000 /* RX_ALARM control */ +#define MDIO_PMA_LASI_TXCTRL 0x9001 /* TX_ALARM control */ +#define MDIO_PMA_LASI_CTRL 0x9002 /* LASI control */ +#define MDIO_PMA_LASI_RXSTAT 0x9003 /* RX_ALARM status */ +#define MDIO_PMA_LASI_TXSTAT 0x9004 /* TX_ALARM status */ +#define MDIO_PMA_LASI_STAT 0x9005 /* LASI status */ + +/* Control register 1. */ +/* Enable extended speed selection */ +#define MDIO_CTRL1_SPEEDSELEXT (BMCR_SPEED1000 | BMCR_SPEED100) +/* All speed selection bits */ +#define MDIO_CTRL1_SPEEDSEL (MDIO_CTRL1_SPEEDSELEXT | 0x003c) +#define MDIO_CTRL1_FULLDPLX BMCR_FULLDPLX +#define MDIO_CTRL1_LPOWER BMCR_PDOWN +#define MDIO_CTRL1_RESET BMCR_RESET +#define MDIO_PMA_CTRL1_LOOPBACK 0x0001 +#define MDIO_PMA_CTRL1_SPEED1000 BMCR_SPEED1000 +#define MDIO_PMA_CTRL1_SPEED100 BMCR_SPEED100 +#define MDIO_PCS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_PHYXS_CTRL1_LOOPBACK BMCR_LOOPBACK +#define MDIO_AN_CTRL1_RESTART BMCR_ANRESTART +#define MDIO_AN_CTRL1_ENABLE BMCR_ANENABLE +#define MDIO_AN_CTRL1_XNP 0x2000 /* Enable extended next page */ + +/* 10 Gb/s */ +#define MDIO_CTRL1_SPEED10G (MDIO_CTRL1_SPEEDSELEXT | 0x00) +/* 10PASS-TS/2BASE-TL */ +#define MDIO_CTRL1_SPEED10P2B (MDIO_CTRL1_SPEEDSELEXT | 0x04) + +/* Status register 1. */ +#define MDIO_STAT1_LPOWERABLE 0x0002 /* Low-power ability */ +#define MDIO_STAT1_LSTATUS BMSR_LSTATUS +#define MDIO_STAT1_FAULT 0x0080 /* Fault */ +#define MDIO_AN_STAT1_LPABLE 0x0001 /* Link partner AN ability */ +#define MDIO_AN_STAT1_ABLE BMSR_ANEGCAPABLE +#define MDIO_AN_STAT1_RFAULT BMSR_RFAULT +#define MDIO_AN_STAT1_COMPLETE BMSR_ANEGCOMPLETE +#define MDIO_AN_STAT1_PAGE 0x0040 /* Page received */ +#define MDIO_AN_STAT1_XNP 0x0080 /* Extended next page status */ + +/* Speed register. */ +#define MDIO_SPEED_10G 0x0001 /* 10G capable */ +#define MDIO_PMA_SPEED_2B 0x0002 /* 2BASE-TL capable */ +#define MDIO_PMA_SPEED_10P 0x0004 /* 10PASS-TS capable */ +#define MDIO_PMA_SPEED_1000 0x0010 /* 1000M capable */ +#define MDIO_PMA_SPEED_100 0x0020 /* 100M capable */ +#define MDIO_PMA_SPEED_10 0x0040 /* 10M capable */ +#define MDIO_PCS_SPEED_10P2B 0x0002 /* 10PASS-TS/2BASE-TL capable */ + +/* Device present registers. */ +#define MDIO_DEVS_PRESENT(devad) (1 << (devad)) +#define MDIO_DEVS_PMAPMD MDIO_DEVS_PRESENT(MDIO_MMD_PMAPMD) +#define MDIO_DEVS_WIS MDIO_DEVS_PRESENT(MDIO_MMD_WIS) +#define MDIO_DEVS_PCS MDIO_DEVS_PRESENT(MDIO_MMD_PCS) +#define MDIO_DEVS_PHYXS MDIO_DEVS_PRESENT(MDIO_MMD_PHYXS) +#define MDIO_DEVS_DTEXS MDIO_DEVS_PRESENT(MDIO_MMD_DTEXS) +#define MDIO_DEVS_TC MDIO_DEVS_PRESENT(MDIO_MMD_TC) +#define MDIO_DEVS_AN MDIO_DEVS_PRESENT(MDIO_MMD_AN) +#define MDIO_DEVS_C22EXT MDIO_DEVS_PRESENT(MDIO_MMD_C22EXT) + +/* Control register 2. */ +#define MDIO_PMA_CTRL2_TYPE 0x000f /* PMA/PMD type selection */ +#define MDIO_PMA_CTRL2_10GBCX4 0x0000 /* 10GBASE-CX4 type */ +#define MDIO_PMA_CTRL2_10GBEW 0x0001 /* 10GBASE-EW type */ +#define MDIO_PMA_CTRL2_10GBLW 0x0002 /* 10GBASE-LW type */ +#define MDIO_PMA_CTRL2_10GBSW 0x0003 /* 10GBASE-SW type */ +#define MDIO_PMA_CTRL2_10GBLX4 0x0004 /* 10GBASE-LX4 type */ +#define MDIO_PMA_CTRL2_10GBER 0x0005 /* 10GBASE-ER type */ +#define MDIO_PMA_CTRL2_10GBLR 0x0006 /* 10GBASE-LR type */ +#define MDIO_PMA_CTRL2_10GBSR 0x0007 /* 10GBASE-SR type */ +#define MDIO_PMA_CTRL2_10GBLRM 0x0008 /* 10GBASE-LRM type */ +#define MDIO_PMA_CTRL2_10GBT 0x0009 /* 10GBASE-T type */ +#define MDIO_PMA_CTRL2_10GBKX4 0x000a /* 10GBASE-KX4 type */ +#define MDIO_PMA_CTRL2_10GBKR 0x000b /* 10GBASE-KR type */ +#define MDIO_PMA_CTRL2_1000BT 0x000c /* 1000BASE-T type */ +#define MDIO_PMA_CTRL2_1000BKX 0x000d /* 1000BASE-KX type */ +#define MDIO_PMA_CTRL2_100BTX 0x000e /* 100BASE-TX type */ +#define MDIO_PMA_CTRL2_10BT 0x000f /* 10BASE-T type */ +#define MDIO_PCS_CTRL2_TYPE 0x0003 /* PCS type selection */ +#define MDIO_PCS_CTRL2_10GBR 0x0000 /* 10GBASE-R type */ +#define MDIO_PCS_CTRL2_10GBX 0x0001 /* 10GBASE-X type */ +#define MDIO_PCS_CTRL2_10GBW 0x0002 /* 10GBASE-W type */ +#define MDIO_PCS_CTRL2_10GBT 0x0003 /* 10GBASE-T type */ + +/* Status register 2. */ +#define MDIO_STAT2_RXFAULT 0x0400 /* Receive fault */ +#define MDIO_STAT2_TXFAULT 0x0800 /* Transmit fault */ +#define MDIO_STAT2_DEVPRST 0xc000 /* Device present */ +#define MDIO_STAT2_DEVPRST_VAL 0x8000 /* Device present value */ +#define MDIO_PMA_STAT2_LBABLE 0x0001 /* PMA loopback ability */ +#define MDIO_PMA_STAT2_10GBEW 0x0002 /* 10GBASE-EW ability */ +#define MDIO_PMA_STAT2_10GBLW 0x0004 /* 10GBASE-LW ability */ +#define MDIO_PMA_STAT2_10GBSW 0x0008 /* 10GBASE-SW ability */ +#define MDIO_PMA_STAT2_10GBLX4 0x0010 /* 10GBASE-LX4 ability */ +#define MDIO_PMA_STAT2_10GBER 0x0020 /* 10GBASE-ER ability */ +#define MDIO_PMA_STAT2_10GBLR 0x0040 /* 10GBASE-LR ability */ +#define MDIO_PMA_STAT2_10GBSR 0x0080 /* 10GBASE-SR ability */ +#define MDIO_PMD_STAT2_TXDISAB 0x0100 /* PMD TX disable ability */ +#define MDIO_PMA_STAT2_EXTABLE 0x0200 /* Extended abilities */ +#define MDIO_PMA_STAT2_RXFLTABLE 0x1000 /* Receive fault ability */ +#define MDIO_PMA_STAT2_TXFLTABLE 0x2000 /* Transmit fault ability */ +#define MDIO_PCS_STAT2_10GBR 0x0001 /* 10GBASE-R capable */ +#define MDIO_PCS_STAT2_10GBX 0x0002 /* 10GBASE-X capable */ +#define MDIO_PCS_STAT2_10GBW 0x0004 /* 10GBASE-W capable */ +#define MDIO_PCS_STAT2_RXFLTABLE 0x1000 /* Receive fault ability */ +#define MDIO_PCS_STAT2_TXFLTABLE 0x2000 /* Transmit fault ability */ + +/* Transmit disable register. */ +#define MDIO_PMD_TXDIS_GLOBAL 0x0001 /* Global PMD TX disable */ +#define MDIO_PMD_TXDIS_0 0x0002 /* PMD TX disable 0 */ +#define MDIO_PMD_TXDIS_1 0x0004 /* PMD TX disable 1 */ +#define MDIO_PMD_TXDIS_2 0x0008 /* PMD TX disable 2 */ +#define MDIO_PMD_TXDIS_3 0x0010 /* PMD TX disable 3 */ + +/* Receive signal detect register. */ +#define MDIO_PMD_RXDET_GLOBAL 0x0001 /* Global PMD RX signal detect */ +#define MDIO_PMD_RXDET_0 0x0002 /* PMD RX signal detect 0 */ +#define MDIO_PMD_RXDET_1 0x0004 /* PMD RX signal detect 1 */ +#define MDIO_PMD_RXDET_2 0x0008 /* PMD RX signal detect 2 */ +#define MDIO_PMD_RXDET_3 0x0010 /* PMD RX signal detect 3 */ + +/* Extended abilities register. */ +#define MDIO_PMA_EXTABLE_10GCX4 0x0001 /* 10GBASE-CX4 ability */ +#define MDIO_PMA_EXTABLE_10GBLRM 0x0002 /* 10GBASE-LRM ability */ +#define MDIO_PMA_EXTABLE_10GBT 0x0004 /* 10GBASE-T ability */ +#define MDIO_PMA_EXTABLE_10GBKX4 0x0008 /* 10GBASE-KX4 ability */ +#define MDIO_PMA_EXTABLE_10GBKR 0x0010 /* 10GBASE-KR ability */ +#define MDIO_PMA_EXTABLE_1000BT 0x0020 /* 1000BASE-T ability */ +#define MDIO_PMA_EXTABLE_1000BKX 0x0040 /* 1000BASE-KX ability */ +#define MDIO_PMA_EXTABLE_100BTX 0x0080 /* 100BASE-TX ability */ +#define MDIO_PMA_EXTABLE_10BT 0x0100 /* 10BASE-T ability */ + +/* PHY XGXS lane state register. */ +#define MDIO_PHYXS_LNSTAT_SYNC0 0x0001 +#define MDIO_PHYXS_LNSTAT_SYNC1 0x0002 +#define MDIO_PHYXS_LNSTAT_SYNC2 0x0004 +#define MDIO_PHYXS_LNSTAT_SYNC3 0x0008 +#define MDIO_PHYXS_LNSTAT_ALIGN 0x1000 + +/* PMA 10GBASE-T pair swap & polarity */ +#define MDIO_PMA_10GBT_SWAPPOL_ABNX 0x0001 /* Pair A/B uncrossed */ +#define MDIO_PMA_10GBT_SWAPPOL_CDNX 0x0002 /* Pair C/D uncrossed */ +#define MDIO_PMA_10GBT_SWAPPOL_AREV 0x0100 /* Pair A polarity reversed */ +#define MDIO_PMA_10GBT_SWAPPOL_BREV 0x0200 /* Pair B polarity reversed */ +#define MDIO_PMA_10GBT_SWAPPOL_CREV 0x0400 /* Pair C polarity reversed */ +#define MDIO_PMA_10GBT_SWAPPOL_DREV 0x0800 /* Pair D polarity reversed */ + +/* PMA 10GBASE-T TX power register. */ +#define MDIO_PMA_10GBT_TXPWR_SHORT 0x0001 /* Short-reach mode */ + +/* PMA 10GBASE-T SNR registers. */ +/* Value is SNR margin in dB, clamped to range [-127, 127], plus 0x8000. */ +#define MDIO_PMA_10GBT_SNR_BIAS 0x8000 +#define MDIO_PMA_10GBT_SNR_MAX 127 + +/* PMA 10GBASE-R FEC ability register. */ +#define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001 /* FEC ability */ +#define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002 /* FEC error indic. ability */ + +/* PCS 10GBASE-R/-T status register 1. */ +#define MDIO_PCS_10GBRT_STAT1_BLKLK 0x0001 /* Block lock attained */ + +/* PCS 10GBASE-R/-T status register 2. */ +#define MDIO_PCS_10GBRT_STAT2_ERR 0x00ff +#define MDIO_PCS_10GBRT_STAT2_BER 0x3f00 + +/* AN 10GBASE-T control register. */ +#define MDIO_AN_10GBT_CTRL_ADV10G 0x1000 /* Advertise 10GBASE-T */ + +/* AN 10GBASE-T status register. */ +#define MDIO_AN_10GBT_STAT_LPTRR 0x0200 /* LP training reset req. */ +#define MDIO_AN_10GBT_STAT_LPLTABLE 0x0400 /* LP loop timing ability */ +#define MDIO_AN_10GBT_STAT_LP10G 0x0800 /* LP is 10GBT capable */ +#define MDIO_AN_10GBT_STAT_REMOK 0x1000 /* Remote OK */ +#define MDIO_AN_10GBT_STAT_LOCOK 0x2000 /* Local OK */ +#define MDIO_AN_10GBT_STAT_MS 0x4000 /* Master/slave config */ +#define MDIO_AN_10GBT_STAT_MSFLT 0x8000 /* Master/slave config fault */ + +/* LASI RX_ALARM control/status registers. */ +#define MDIO_PMA_LASI_RX_PHYXSLFLT 0x0001 /* PHY XS RX local fault */ +#define MDIO_PMA_LASI_RX_PCSLFLT 0x0008 /* PCS RX local fault */ +#define MDIO_PMA_LASI_RX_PMALFLT 0x0010 /* PMA/PMD RX local fault */ +#define MDIO_PMA_LASI_RX_OPTICPOWERFLT 0x0020 /* RX optical power fault */ +#define MDIO_PMA_LASI_RX_WISLFLT 0x0200 /* WIS local fault */ + +/* LASI TX_ALARM control/status registers. */ +#define MDIO_PMA_LASI_TX_PHYXSLFLT 0x0001 /* PHY XS TX local fault */ +#define MDIO_PMA_LASI_TX_PCSLFLT 0x0008 /* PCS TX local fault */ +#define MDIO_PMA_LASI_TX_PMALFLT 0x0010 /* PMA/PMD TX local fault */ +#define MDIO_PMA_LASI_TX_LASERPOWERFLT 0x0080 /* Laser output power fault */ +#define MDIO_PMA_LASI_TX_LASERTEMPFLT 0x0100 /* Laser temperature fault */ +#define MDIO_PMA_LASI_TX_LASERBICURRFLT 0x0200 /* Laser bias current fault */ + +/* LASI control/status registers. */ +#define MDIO_PMA_LASI_LSALARM 0x0001 /* LS_ALARM enable/status */ +#define MDIO_PMA_LASI_TXALARM 0x0002 /* TX_ALARM enable/status */ +#define MDIO_PMA_LASI_RXALARM 0x0004 /* RX_ALARM enable/status */ + +/* Mapping between MDIO PRTAD/DEVAD and mii_ioctl_data::phy_id */ + +#define MDIO_PHY_ID_C45 0x8000 +#define MDIO_PHY_ID_PRTAD 0x03e0 +#define MDIO_PHY_ID_DEVAD 0x001f +#define MDIO_PHY_ID_C45_MASK \ + (MDIO_PHY_ID_C45 | MDIO_PHY_ID_PRTAD | MDIO_PHY_ID_DEVAD) + +static inline __u16 mdio_phy_id_c45(int prtad, int devad) +{ + return MDIO_PHY_ID_C45 | (prtad << 5) | devad; +} + +static inline bool mdio_phy_id_is_c45(int phy_id) +{ + return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK); +} + +static inline __u16 mdio_phy_id_prtad(int phy_id) +{ + return (phy_id & MDIO_PHY_ID_PRTAD) >> 5; +} + +static inline __u16 mdio_phy_id_devad(int phy_id) +{ + return phy_id & MDIO_PHY_ID_DEVAD; +} + +#define MDIO_SUPPORTS_C22 1 +#define MDIO_SUPPORTS_C45 2 + +#ifdef __KERNEL__ + +/** + * struct mdio_if_info - Ethernet controller MDIO interface + * @prtad: PRTAD of the PHY (%MDIO_PRTAD_NONE if not present/unknown) + * @mmds: Mask of MMDs expected to be present in the PHY. This must be + * non-zero unless @prtad = %MDIO_PRTAD_NONE. + * @mode_support: MDIO modes supported. If %MDIO_SUPPORTS_C22 is set then + * MII register access will be passed through with @devad = + * %MDIO_DEVAD_NONE. If %MDIO_EMULATE_C22 is set then access to + * commonly used clause 22 registers will be translated into + * clause 45 registers. + * @dev: Net device structure + * @mdio_read: Register read function; returns value or negative error code + * @mdio_write: Register write function; returns 0 or negative error code + */ +struct mdio_if_info { + int prtad; + u32 mmds; + unsigned mode_support; + + struct net_device *dev; + int (*mdio_read)(struct net_device *dev, int prtad, int devad, + u16 addr); + int (*mdio_write)(struct net_device *dev, int prtad, int devad, + u16 addr, u16 val); +}; + +#define MDIO_PRTAD_NONE (-1) +#define MDIO_DEVAD_NONE (-1) +#define MDIO_EMULATE_C22 4 + +struct ethtool_cmd; +struct ethtool_pauseparam; +extern int mdio45_probe(struct mdio_if_info *mdio, int prtad); +extern int mdio_set_flag(const struct mdio_if_info *mdio, + int prtad, int devad, u16 addr, int mask, + bool sense); +extern int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmds); +extern int mdio45_nway_restart(const struct mdio_if_info *mdio); +extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio, + struct ethtool_cmd *ecmd, + u32 npage_adv, u32 npage_lpa); +extern void +mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio, + const struct ethtool_pauseparam *ecmd); + +/** + * mdio45_ethtool_gset - get settings for ETHTOOL_GSET + * @mdio: MDIO interface + * @ecmd: Ethtool request structure + * + * Since the CSRs for auto-negotiation using next pages are not fully + * standardised, this function does not attempt to decode them. Use + * mdio45_ethtool_gset_npage() to specify advertisement bits from next + * pages. + */ +static inline void mdio45_ethtool_gset(const struct mdio_if_info *mdio, + struct ethtool_cmd *ecmd) +{ + mdio45_ethtool_gset_npage(mdio, ecmd, 0, 0); +} + +extern int mdio_mii_ioctl(const struct mdio_if_info *mdio, + struct mii_ioctl_data *mii_data, int cmd); + +#endif /* __KERNEL__ */ +#endif /* __LINUX_MDIO_H__ */ diff --git a/libdde-linux26/contrib/include/linux/netdevice.h b/libdde-linux26/contrib/include/linux/netdevice.h index 65936673..4414989d 100644 --- a/libdde-linux26/contrib/include/linux/netdevice.h +++ b/libdde-linux26/contrib/include/linux/netdevice.h @@ -37,6 +37,7 @@ #include <asm/byteorder.h> #include <linux/device.h> +#include <linux/rculist.h> #include <linux/percpu.h> #include <linux/dmaengine.h> #include <linux/workqueue.h> @@ -81,17 +82,19 @@ struct wireless_dev; #define net_xmit_eval(e) ((e) == NET_XMIT_CN? 0 : (e)) #define net_xmit_errno(e) ((e) != NET_XMIT_CN ? -ENOBUFS : 0) +/* Driver transmit return codes */ +enum netdev_tx { + NETDEV_TX_OK = 0, /* driver took care of packet */ + NETDEV_TX_BUSY, /* driver tx path was busy*/ + NETDEV_TX_LOCKED = -1, /* driver tx lock was already taken */ +}; +typedef enum netdev_tx netdev_tx_t; + #endif #define MAX_ADDR_LEN 32 /* Largest hardware address length */ -/* Driver transmit return codes */ -#define NETDEV_TX_OK 0 /* driver took care of packet */ -#define NETDEV_TX_BUSY 1 /* driver tx path was busy*/ -#define NETDEV_TX_LOCKED -1 /* driver tx lock was already taken */ - #ifdef __KERNEL__ - /* * Compute the worst case header length according to the protocols * used. @@ -209,6 +212,24 @@ struct dev_addr_list #define dmi_users da_users #define dmi_gusers da_gusers +struct netdev_hw_addr { + struct list_head list; + unsigned char addr[MAX_ADDR_LEN]; + unsigned char type; +#define NETDEV_HW_ADDR_T_LAN 1 +#define NETDEV_HW_ADDR_T_SAN 2 +#define NETDEV_HW_ADDR_T_SLAVE 3 +#define NETDEV_HW_ADDR_T_UNICAST 4 + int refcount; + bool synced; + struct rcu_head rcu_head; +}; + +struct netdev_hw_addr_list { + struct list_head list; + int count; +}; + struct hh_cache { struct hh_cache *hh_next; /* Next entry */ @@ -441,6 +462,10 @@ struct netdev_queue { spinlock_t _xmit_lock; int xmit_lock_owner; struct Qdisc *qdisc_sleeping; + /* + * please use this field instead of dev->trans_start + */ + unsigned long trans_start; } ____cacheline_aligned_in_smp; @@ -467,9 +492,11 @@ struct netdev_queue { * This function is called when network device transistions to the down * state. * - * int (*ndo_start_xmit)(struct sk_buff *skb, struct net_device *dev); + * netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb, + * struct net_device *dev); * Called when a packet needs to be transmitted. - * Must return NETDEV_TX_OK , NETDEV_TX_BUSY, or NETDEV_TX_LOCKED, + * Must return NETDEV_TX_OK , NETDEV_TX_BUSY. + * (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX) * Required can not be NULL. * * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb); @@ -540,7 +567,7 @@ struct net_device_ops { void (*ndo_uninit)(struct net_device *dev); int (*ndo_open)(struct net_device *dev); int (*ndo_stop)(struct net_device *dev); - int (*ndo_start_xmit) (struct sk_buff *skb, + netdev_tx_t (*ndo_start_xmit) (struct sk_buff *skb, struct net_device *dev); u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb); @@ -724,10 +751,10 @@ struct net_device unsigned char addr_len; /* hardware address length */ unsigned short dev_id; /* for shared network cards */ - spinlock_t addr_list_lock; - struct dev_addr_list *uc_list; /* Secondary unicast mac addresses */ - int uc_count; /* Number of installed ucasts */ + struct netdev_hw_addr_list uc; /* Secondary unicast + mac addresses */ int uc_promisc; + spinlock_t addr_list_lock; struct dev_addr_list *mc_list; /* Multicast mac addresses */ int mc_count; /* Number of installed mcasts */ unsigned int promiscuity; @@ -753,8 +780,12 @@ struct net_device */ unsigned long last_rx; /* Time of last Rx */ /* Interface address info used in eth_type_trans() */ - unsigned char dev_addr[MAX_ADDR_LEN]; /* hw address, (before bcast - because most packets are unicast) */ + unsigned char *dev_addr; /* hw address, (before bcast + because most packets are + unicast) */ + + struct netdev_hw_addr_list dev_addrs; /* list of device + hw addresses */ unsigned char broadcast[MAX_ADDR_LEN]; /* hw bcast add */ @@ -774,6 +805,11 @@ struct net_device * One part is mostly used on xmit path (device) */ /* These may be needed for future network-power-down code. */ + + /* + * trans_start here is expensive for high speed devices on SMP, + * please use netdev_queue->trans_start instead. + */ unsigned long trans_start; /* Time (in jiffies) of last Tx */ int watchdog_timeo; /* used by dev_watchdog() */ @@ -1450,6 +1486,8 @@ static inline int netif_carrier_ok(const struct net_device *dev) return !test_bit(__LINK_STATE_NOCARRIER, &dev->state); } +extern unsigned long dev_trans_start(struct net_device *dev); + extern void __netdev_watchdog_up(struct net_device *dev); extern void netif_carrier_on(struct net_device *dev); @@ -1764,6 +1802,13 @@ static inline void netif_addr_unlock_bh(struct net_device *dev) spin_unlock_bh(&dev->addr_list_lock); } +/* + * dev_addrs walker. Should be used only for read access. Call with + * rcu_read_lock held. + */ +#define for_each_dev_addr(dev, ha) \ + list_for_each_entry_rcu(ha, &dev->dev_addrs.list, list) + /* These functions live elsewhere (drivers/net/net_init.c, but related) */ extern void ether_setup(struct net_device *dev); @@ -1776,11 +1821,24 @@ extern struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, alloc_netdev_mq(sizeof_priv, name, setup, 1) extern int register_netdev(struct net_device *dev); extern void unregister_netdev(struct net_device *dev); + +/* Functions used for device addresses handling */ +extern int dev_addr_add(struct net_device *dev, unsigned char *addr, + unsigned char addr_type); +extern int dev_addr_del(struct net_device *dev, unsigned char *addr, + unsigned char addr_type); +extern int dev_addr_add_multiple(struct net_device *to_dev, + struct net_device *from_dev, + unsigned char addr_type); +extern int dev_addr_del_multiple(struct net_device *to_dev, + struct net_device *from_dev, + unsigned char addr_type); + /* Functions used for secondary unicast and multicast support */ extern void dev_set_rx_mode(struct net_device *dev); extern void __dev_set_rx_mode(struct net_device *dev); -extern int dev_unicast_delete(struct net_device *dev, void *addr, int alen); -extern int dev_unicast_add(struct net_device *dev, void *addr, int alen); +extern int dev_unicast_delete(struct net_device *dev, void *addr); +extern int dev_unicast_add(struct net_device *dev, void *addr); extern int dev_unicast_sync(struct net_device *to, struct net_device *from); extern void dev_unicast_unsync(struct net_device *to, struct net_device *from); extern int dev_mc_delete(struct net_device *dev, void *addr, int alen, int all); diff --git a/libdde-linux26/contrib/include/linux/pci.h b/libdde-linux26/contrib/include/linux/pci.h index 7bd624bf..c7fb6600 100644 --- a/libdde-linux26/contrib/include/linux/pci.h +++ b/libdde-linux26/contrib/include/linux/pci.h @@ -256,6 +256,7 @@ struct pci_dev { unsigned int ari_enabled:1; /* ARI forwarding */ unsigned int is_managed:1; unsigned int is_pcie:1; + unsigned int needs_freset:1; /* Dev requires fundamental reset */ unsigned int state_saved:1; pci_dev_flags_t dev_flags; atomic_t enable_cnt; /* pci_enable_device has been called */ diff --git a/libdde-linux26/contrib/include/linux/pci_ids.h b/libdde-linux26/contrib/include/linux/pci_ids.h index aca8c458..a3393863 100644 --- a/libdde-linux26/contrib/include/linux/pci_ids.h +++ b/libdde-linux26/contrib/include/linux/pci_ids.h @@ -2,6 +2,9 @@ * PCI Class, Vendor and Device IDs * * Please keep sorted. + * + * Do not add new entries to this file unless the definitions + * are shared between multiple drivers. */ /* Device classes and subclasses */ @@ -104,6 +107,7 @@ #define PCI_CLASS_SERIAL_USB_UHCI 0x0c0300 #define PCI_CLASS_SERIAL_USB_OHCI 0x0c0310 #define PCI_CLASS_SERIAL_USB_EHCI 0x0c0320 +#define PCI_CLASS_SERIAL_USB_XHCI 0x0c0330 #define PCI_CLASS_SERIAL_FIBER 0x0c04 #define PCI_CLASS_SERIAL_SMBUS 0x0c05 @@ -389,6 +393,9 @@ #define PCI_DEVICE_ID_VLSI_82C147 0x0105 #define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 +/* AMD RD890 Chipset */ +#define PCI_DEVICE_ID_RD890_IOMMU 0x5a23 + #define PCI_VENDOR_ID_ADL 0x1005 #define PCI_DEVICE_ID_ADL_2301 0x2301 @@ -478,6 +485,9 @@ #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361 #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL 0x252 +#define PCI_SUBVENDOR_ID_IBM 0x1014 +#define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT 0x03d4 + #define PCI_VENDOR_ID_UNISYS 0x1018 #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C @@ -526,6 +536,7 @@ #define PCI_DEVICE_ID_AMD_OPUS_7443 0x7443 #define PCI_DEVICE_ID_AMD_VIPER_7443 0x7443 #define PCI_DEVICE_ID_AMD_OPUS_7445 0x7445 +#define PCI_DEVICE_ID_AMD_8111_PCI 0x7460 #define PCI_DEVICE_ID_AMD_8111_LPC 0x7468 #define PCI_DEVICE_ID_AMD_8111_IDE 0x7469 #define PCI_DEVICE_ID_AMD_8111_SMBUS2 0x746a @@ -535,6 +546,8 @@ #define PCI_DEVICE_ID_AMD_8131_BRIDGE 0x7450 #define PCI_DEVICE_ID_AMD_8131_APIC 0x7451 #define PCI_DEVICE_ID_AMD_8132_BRIDGE 0x7458 +#define PCI_DEVICE_ID_AMD_HUDSON2_SMBUS 0x780b +#define PCI_DEVICE_ID_AMD_CS5535_IDE 0x208F #define PCI_DEVICE_ID_AMD_CS5536_ISA 0x2090 #define PCI_DEVICE_ID_AMD_CS5536_FLASH 0x2091 #define PCI_DEVICE_ID_AMD_CS5536_AUDIO 0x2093 @@ -543,9 +556,10 @@ #define PCI_DEVICE_ID_AMD_CS5536_UDC 0x2096 #define PCI_DEVICE_ID_AMD_CS5536_UOC 0x2097 #define PCI_DEVICE_ID_AMD_CS5536_IDE 0x209A - #define PCI_DEVICE_ID_AMD_LX_VIDEO 0x2081 #define PCI_DEVICE_ID_AMD_LX_AES 0x2082 +#define PCI_DEVICE_ID_AMD_HUDSON2_IDE 0x780c +#define PCI_DEVICE_ID_AMD_HUDSON2_SATA_IDE 0x7800 #define PCI_VENDOR_ID_TRIDENT 0x1023 #define PCI_DEVICE_ID_TRIDENT_4DWAVE_DX 0x2000 @@ -591,6 +605,8 @@ #define PCI_DEVICE_ID_MATROX_G550 0x2527 #define PCI_DEVICE_ID_MATROX_VIA 0x4536 +#define PCI_VENDOR_ID_MOBILITY_ELECTRONICS 0x14f2 + #define PCI_VENDOR_ID_CT 0x102c #define PCI_DEVICE_ID_CT_69000 0x00c0 #define PCI_DEVICE_ID_CT_65545 0x00d8 @@ -766,6 +782,7 @@ #define PCI_DEVICE_ID_TI_X515 0x8036 #define PCI_DEVICE_ID_TI_XX12 0x8039 #define PCI_DEVICE_ID_TI_XX12_FM 0x803b +#define PCI_DEVICE_ID_TI_XIO2000A 0x8231 #define PCI_DEVICE_ID_TI_1130 0xac12 #define PCI_DEVICE_ID_TI_1031 0xac13 #define PCI_DEVICE_ID_TI_1131 0xac15 @@ -834,6 +851,8 @@ #define PCI_DEVICE_ID_PROMISE_20276 0x5275 #define PCI_DEVICE_ID_PROMISE_20277 0x7275 +#define PCI_VENDOR_ID_FOXCONN 0x105b + #define PCI_VENDOR_ID_UMC 0x1060 #define PCI_DEVICE_ID_UMC_UM8673F 0x0101 #define PCI_DEVICE_ID_UMC_UM8886BF 0x673a @@ -873,6 +892,7 @@ #define PCI_DEVICE_ID_APPLE_SH_SUNGEM 0x0051 #define PCI_DEVICE_ID_APPLE_U3L_AGP 0x0058 #define PCI_DEVICE_ID_APPLE_U3H_AGP 0x0059 +#define PCI_DEVICE_ID_APPLE_U4_PCIE 0x005b #define PCI_DEVICE_ID_APPLE_IPID2_AGP 0x0066 #define PCI_DEVICE_ID_APPLE_IPID2_ATA 0x0069 #define PCI_DEVICE_ID_APPLE_IPID2_FW 0x006a @@ -941,6 +961,32 @@ #define PCI_DEVICE_ID_SUN_TOMATILLO 0xa801 #define PCI_DEVICE_ID_SUN_CASSINI 0xabba +#define PCI_VENDOR_ID_NI 0x1093 +#define PCI_DEVICE_ID_NI_PCI2322 0xd130 +#define PCI_DEVICE_ID_NI_PCI2324 0xd140 +#define PCI_DEVICE_ID_NI_PCI2328 0xd150 +#define PCI_DEVICE_ID_NI_PXI8422_2322 0xd190 +#define PCI_DEVICE_ID_NI_PXI8422_2324 0xd1a0 +#define PCI_DEVICE_ID_NI_PXI8420_2322 0xd1d0 +#define PCI_DEVICE_ID_NI_PXI8420_2324 0xd1e0 +#define PCI_DEVICE_ID_NI_PXI8420_2328 0xd1f0 +#define PCI_DEVICE_ID_NI_PXI8420_23216 0xd1f1 +#define PCI_DEVICE_ID_NI_PCI2322I 0xd250 +#define PCI_DEVICE_ID_NI_PCI2324I 0xd270 +#define PCI_DEVICE_ID_NI_PCI23216 0xd2b0 +#define PCI_DEVICE_ID_NI_PXI8430_2322 0x7080 +#define PCI_DEVICE_ID_NI_PCI8430_2322 0x70db +#define PCI_DEVICE_ID_NI_PXI8430_2324 0x70dd +#define PCI_DEVICE_ID_NI_PCI8430_2324 0x70df +#define PCI_DEVICE_ID_NI_PXI8430_2328 0x70e2 +#define PCI_DEVICE_ID_NI_PCI8430_2328 0x70e4 +#define PCI_DEVICE_ID_NI_PXI8430_23216 0x70e6 +#define PCI_DEVICE_ID_NI_PCI8430_23216 0x70e7 +#define PCI_DEVICE_ID_NI_PXI8432_2322 0x70e8 +#define PCI_DEVICE_ID_NI_PCI8432_2322 0x70ea +#define PCI_DEVICE_ID_NI_PXI8432_2324 0x70ec +#define PCI_DEVICE_ID_NI_PCI8432_2324 0x70ee + #define PCI_VENDOR_ID_CMD 0x1095 #define PCI_DEVICE_ID_CMD_643 0x0643 #define PCI_DEVICE_ID_CMD_646 0x0646 @@ -976,6 +1022,7 @@ #define PCI_DEVICE_ID_PLX_PCI200SYN 0x3196 #define PCI_DEVICE_ID_PLX_9030 0x9030 #define PCI_DEVICE_ID_PLX_9050 0x9050 +#define PCI_DEVICE_ID_PLX_9056 0x9056 #define PCI_DEVICE_ID_PLX_9080 0x9080 #define PCI_DEVICE_ID_PLX_GTEK_SERIAL2 0xa001 @@ -1037,8 +1084,6 @@ #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SMBUS 0x0034 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE 0x0035 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA 0x0036 -#define PCI_DEVICE_ID_NVIDIA_NVENET_10 0x0037 -#define PCI_DEVICE_ID_NVIDIA_NVENET_11 0x0038 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2 0x003e #define PCI_DEVICE_ID_NVIDIA_GEFORCE_6800_ULTRA 0x0040 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_6800 0x0041 @@ -1049,21 +1094,16 @@ #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_IDE 0x0053 #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA 0x0054 #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2 0x0055 -#define PCI_DEVICE_ID_NVIDIA_NVENET_8 0x0056 -#define PCI_DEVICE_ID_NVIDIA_NVENET_9 0x0057 #define PCI_DEVICE_ID_NVIDIA_CK804_AUDIO 0x0059 #define PCI_DEVICE_ID_NVIDIA_CK804_PCIE 0x005d #define PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS 0x0064 #define PCI_DEVICE_ID_NVIDIA_NFORCE2_IDE 0x0065 -#define PCI_DEVICE_ID_NVIDIA_NVENET_2 0x0066 #define PCI_DEVICE_ID_NVIDIA_MCP2_MODEM 0x0069 #define PCI_DEVICE_ID_NVIDIA_MCP2_AUDIO 0x006a #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS 0x0084 #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_IDE 0x0085 -#define PCI_DEVICE_ID_NVIDIA_NVENET_4 0x0086 #define PCI_DEVICE_ID_NVIDIA_MCP2S_MODEM 0x0089 #define PCI_DEVICE_ID_NVIDIA_CK8_AUDIO 0x008a -#define PCI_DEVICE_ID_NVIDIA_NVENET_5 0x008c #define PCI_DEVICE_ID_NVIDIA_NFORCE2S_SATA 0x008e #define PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GT 0x0090 #define PCI_DEVICE_ID_NVIDIA_GEFORCE_7800_GTX 0x0091 @@ -1079,15 +1119,12 @@ #define PCI_DEVICE_ID_NVIDIA_NFORCE3 0x00d1 #define PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS 0x00d4 #define PCI_DEVICE_ID_NVIDIA_NFORCE3_IDE 0x00d5 -#define PCI_DEVICE_ID_NVIDIA_NVENET_3 0x00d6 #define PCI_DEVICE_ID_NVIDIA_MCP3_MODEM 0x00d9 #define PCI_DEVICE_ID_NVIDIA_MCP3_AUDIO 0x00da -#define PCI_DEVICE_ID_NVIDIA_NVENET_7 0x00df #define PCI_DEVICE_ID_NVIDIA_NFORCE3S 0x00e1 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA 0x00e3 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SMBUS 0x00e4 #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_IDE 0x00e5 -#define PCI_DEVICE_ID_NVIDIA_NVENET_6 0x00e6 #define PCI_DEVICE_ID_NVIDIA_CK8S_AUDIO 0x00ea #define PCI_DEVICE_ID_NVIDIA_NFORCE3S_SATA2 0x00ee #define PCIE_DEVICE_ID_NVIDIA_GEFORCE_6800_ALT1 0x00f0 @@ -1147,7 +1184,6 @@ #define PCI_DEVICE_ID_NVIDIA_NFORCE_SMBUS 0x01b4 #define PCI_DEVICE_ID_NVIDIA_NFORCE_IDE 0x01bc #define PCI_DEVICE_ID_NVIDIA_MCP1_MODEM 0x01c1 -#define PCI_DEVICE_ID_NVIDIA_NVENET_1 0x01c3 #define PCI_DEVICE_ID_NVIDIA_NFORCE2 0x01e0 #define PCI_DEVICE_ID_NVIDIA_GEFORCE3 0x0200 #define PCI_DEVICE_ID_NVIDIA_GEFORCE3_1 0x0201 @@ -1170,8 +1206,6 @@ #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE 0x036E #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA 0x037E #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2 0x037F -#define PCI_DEVICE_ID_NVIDIA_NVENET_12 0x0268 -#define PCI_DEVICE_ID_NVIDIA_NVENET_13 0x0269 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800 0x0280 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800_8X 0x0281 #define PCI_DEVICE_ID_NVIDIA_GEFORCE4_TI_4800SE 0x0282 @@ -1218,42 +1252,22 @@ #define PCI_DEVICE_ID_NVIDIA_GEFORCE_FX_GO5700_2 0x0348 #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_GO1000 0x034C #define PCI_DEVICE_ID_NVIDIA_QUADRO_FX_1100 0x034E -#define PCI_DEVICE_ID_NVIDIA_NVENET_14 0x0372 #define PCI_DEVICE_ID_NVIDIA_NVENET_15 0x0373 -#define PCI_DEVICE_ID_NVIDIA_NVENET_16 0x03E5 -#define PCI_DEVICE_ID_NVIDIA_NVENET_17 0x03E6 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA 0x03E7 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SMBUS 0x03EB #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE 0x03EC -#define PCI_DEVICE_ID_NVIDIA_NVENET_18 0x03EE -#define PCI_DEVICE_ID_NVIDIA_NVENET_19 0x03EF #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2 0x03F6 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3 0x03F7 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_SMBUS 0x0446 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE 0x0448 -#define PCI_DEVICE_ID_NVIDIA_NVENET_20 0x0450 -#define PCI_DEVICE_ID_NVIDIA_NVENET_21 0x0451 -#define PCI_DEVICE_ID_NVIDIA_NVENET_22 0x0452 -#define PCI_DEVICE_ID_NVIDIA_NVENET_23 0x0453 -#define PCI_DEVICE_ID_NVIDIA_NVENET_24 0x054C -#define PCI_DEVICE_ID_NVIDIA_NVENET_25 0x054D -#define PCI_DEVICE_ID_NVIDIA_NVENET_26 0x054E -#define PCI_DEVICE_ID_NVIDIA_NVENET_27 0x054F -#define PCI_DEVICE_ID_NVIDIA_NVENET_28 0x07DC -#define PCI_DEVICE_ID_NVIDIA_NVENET_29 0x07DD -#define PCI_DEVICE_ID_NVIDIA_NVENET_30 0x07DE -#define PCI_DEVICE_ID_NVIDIA_NVENET_31 0x07DF +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_SMBUS 0x0542 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE 0x0560 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_IDE 0x056C +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS 0x0752 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 -#define PCI_DEVICE_ID_NVIDIA_NVENET_32 0x0760 -#define PCI_DEVICE_ID_NVIDIA_NVENET_33 0x0761 -#define PCI_DEVICE_ID_NVIDIA_NVENET_34 0x0762 -#define PCI_DEVICE_ID_NVIDIA_NVENET_35 0x0763 -#define PCI_DEVICE_ID_NVIDIA_NVENET_36 0x0AB0 -#define PCI_DEVICE_ID_NVIDIA_NVENET_37 0x0AB1 -#define PCI_DEVICE_ID_NVIDIA_NVENET_38 0x0AB2 -#define PCI_DEVICE_ID_NVIDIA_NVENET_39 0x0AB3 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2 +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA 0x0D85 #define PCI_VENDOR_ID_IMS 0x10e0 #define PCI_DEVICE_ID_IMS_TT128 0x9128 @@ -1281,6 +1295,13 @@ #define PCI_VENDOR_ID_CREATIVE 0x1102 /* duplicate: ECTIVA */ #define PCI_DEVICE_ID_CREATIVE_EMU10K1 0x0002 +#define PCI_DEVICE_ID_CREATIVE_20K1 0x0005 +#define PCI_DEVICE_ID_CREATIVE_20K2 0x000b +#define PCI_SUBDEVICE_ID_CREATIVE_SB0760 0x0024 +#define PCI_SUBDEVICE_ID_CREATIVE_SB08801 0x0041 +#define PCI_SUBDEVICE_ID_CREATIVE_SB08802 0x0042 +#define PCI_SUBDEVICE_ID_CREATIVE_SB08803 0x0043 +#define PCI_SUBDEVICE_ID_CREATIVE_HENDRIX 0x6000 #define PCI_VENDOR_ID_ECTIVA 0x1102 /* duplicate: CREATIVE */ #define PCI_DEVICE_ID_ECTIVA_EV1938 0x8938 @@ -1373,7 +1394,7 @@ #define PCI_DEVICE_ID_VIA_82C598_1 0x8598 #define PCI_DEVICE_ID_VIA_838X_1 0xB188 #define PCI_DEVICE_ID_VIA_83_87XX_1 0xB198 -#define PCI_DEVICE_ID_VIA_C409_IDE 0XC409 +#define PCI_DEVICE_ID_VIA_VX855_IDE 0xC409 #define PCI_DEVICE_ID_VIA_ANON 0xFFFF #define PCI_VENDOR_ID_SIEMENS 0x110A @@ -1473,6 +1494,7 @@ #define PCI_DEVICE_ID_SERVERWORKS_HT1000IDE 0x0214 #define PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2 0x0217 #define PCI_DEVICE_ID_SERVERWORKS_CSB6LPC 0x0227 +#define PCI_DEVICE_ID_SERVERWORKS_HT1100LD 0x0408 #define PCI_VENDOR_ID_SBE 0x1176 #define PCI_DEVICE_ID_SBE_WANXL100 0x0301 @@ -1516,6 +1538,8 @@ #define PCI_DEVICE_ID_ARTOP_ATP860R 0x0007 #define PCI_DEVICE_ID_ARTOP_ATP865 0x0008 #define PCI_DEVICE_ID_ARTOP_ATP865R 0x0009 +#define PCI_DEVICE_ID_ARTOP_ATP867A 0x000A +#define PCI_DEVICE_ID_ARTOP_ATP867B 0x000B #define PCI_DEVICE_ID_ARTOP_AEC7610 0x8002 #define PCI_DEVICE_ID_ARTOP_AEC7612UW 0x8010 #define PCI_DEVICE_ID_ARTOP_AEC7612U 0x8020 @@ -1813,6 +1837,10 @@ #define PCI_SUBDEVICE_ID_HYPERCOPE_METRO 0x0107 #define PCI_SUBDEVICE_ID_HYPERCOPE_CHAMP2 0x0108 +#define PCI_VENDOR_ID_DIGIGRAM 0x1369 +#define PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_SERIAL_SUBSYSTEM 0xc001 +#define PCI_SUBDEVICE_ID_DIGIGRAM_LX6464ES_CAE_SERIAL_SUBSYSTEM 0xc002 + #define PCI_VENDOR_ID_KAWASAKI 0x136b #define PCI_DEVICE_ID_MCHIP_KL5A72002 0xff01 @@ -1880,6 +1908,8 @@ #define PCI_SUBDEVICE_ID_CCD_SWYX4S 0xB540 #define PCI_SUBDEVICE_ID_CCD_JH4S20 0xB550 #define PCI_SUBDEVICE_ID_CCD_IOB8ST_1 0xB552 +#define PCI_SUBDEVICE_ID_CCD_JHSE1 0xB553 +#define PCI_SUBDEVICE_ID_CCD_JH8S 0xB55B #define PCI_SUBDEVICE_ID_CCD_BN4S 0xB560 #define PCI_SUBDEVICE_ID_CCD_BN8S 0xB562 #define PCI_SUBDEVICE_ID_CCD_BNE1 0xB563 @@ -1932,6 +1962,8 @@ #define PCI_DEVICE_ID_LAVA_DSERIAL 0x0100 /* 2x 16550 */ #define PCI_DEVICE_ID_LAVA_QUATRO_A 0x0101 /* 2x 16550, half of 4 port */ #define PCI_DEVICE_ID_LAVA_QUATRO_B 0x0102 /* 2x 16550, half of 4 port */ +#define PCI_DEVICE_ID_LAVA_QUATTRO_A 0x0120 /* 2x 16550A, half of 4 port */ +#define PCI_DEVICE_ID_LAVA_QUATTRO_B 0x0121 /* 2x 16550A, half of 4 port */ #define PCI_DEVICE_ID_LAVA_OCTO_A 0x0180 /* 4x 16550A, half of 8 port */ #define PCI_DEVICE_ID_LAVA_OCTO_B 0x0181 /* 4x 16550A, half of 8 port */ #define PCI_DEVICE_ID_LAVA_PORT_PLUS 0x0200 /* 2x 16650 */ @@ -1962,15 +1994,21 @@ #define PCI_DEVICE_ID_OXSEMI_PCIe952_1_U 0xC118 #define PCI_DEVICE_ID_OXSEMI_PCIe952_1_GU 0xC11C #define PCI_DEVICE_ID_OXSEMI_16PCI954 0x9501 +#define PCI_DEVICE_ID_OXSEMI_C950 0x950B #define PCI_DEVICE_ID_OXSEMI_16PCI95N 0x9511 #define PCI_DEVICE_ID_OXSEMI_16PCI954PP 0x9513 #define PCI_DEVICE_ID_OXSEMI_16PCI952 0x9521 #define PCI_DEVICE_ID_OXSEMI_16PCI952PP 0x9523 +#define PCI_SUBDEVICE_ID_OXSEMI_C950 0x0001 #define PCI_VENDOR_ID_CHELSIO 0x1425 #define PCI_VENDOR_ID_SAMSUNG 0x144d +#define PCI_VENDOR_ID_GIGABYTE 0x1458 + +#define PCI_VENDOR_ID_AMBIT 0x1468 + #define PCI_VENDOR_ID_MYRICOM 0x14c1 #define PCI_VENDOR_ID_TITAN 0x14D2 @@ -1998,6 +2036,7 @@ #define PCI_DEVICE_ID_AFAVLAB_P030 0x2182 #define PCI_SUBDEVICE_ID_AFAVLAB_P061 0x2150 +#define PCI_VENDOR_ID_BCM_GVC 0x14a4 #define PCI_VENDOR_ID_BROADCOM 0x14e4 #define PCI_DEVICE_ID_TIGON3_5752 0x1600 #define PCI_DEVICE_ID_TIGON3_5752M 0x1601 @@ -2047,7 +2086,6 @@ #define PCI_DEVICE_ID_TIGON3_5787M 0x1693 #define PCI_DEVICE_ID_TIGON3_5782 0x1696 #define PCI_DEVICE_ID_TIGON3_5784 0x1698 -#define PCI_DEVICE_ID_TIGON3_5785 0x1699 #define PCI_DEVICE_ID_TIGON3_5786 0x169a #define PCI_DEVICE_ID_TIGON3_5787 0x169b #define PCI_DEVICE_ID_TIGON3_5788 0x169c @@ -2077,6 +2115,7 @@ #define PCI_VENDOR_ID_MAINPINE 0x1522 #define PCI_DEVICE_ID_MAINPINE_PBRIDGE 0x0100 #define PCI_VENDOR_ID_ENE 0x1524 +#define PCI_DEVICE_ID_ENE_CB710_FLASH 0x0510 #define PCI_DEVICE_ID_ENE_CB712_SD 0x0550 #define PCI_DEVICE_ID_ENE_CB712_SD_2 0x0551 #define PCI_DEVICE_ID_ENE_CB714_SD 0x0750 @@ -2112,6 +2151,8 @@ #define PCI_DEVICE_ID_MELLANOX_SINAI_OLD 0x5e8c #define PCI_DEVICE_ID_MELLANOX_SINAI 0x6274 +#define PCI_VENDOR_ID_DFI 0x15bd + #define PCI_VENDOR_ID_QUICKNET 0x15e2 #define PCI_DEVICE_ID_QUICKNET_XJ 0x0500 @@ -2131,6 +2172,10 @@ #define PCI_DEVICE_ID_ADDIDATA_APCI7420_3 0x700D #define PCI_DEVICE_ID_ADDIDATA_APCI7300_3 0x700E #define PCI_DEVICE_ID_ADDIDATA_APCI7800_3 0x700F +#define PCI_DEVICE_ID_ADDIDATA_APCIe7300 0x7010 +#define PCI_DEVICE_ID_ADDIDATA_APCIe7420 0x7011 +#define PCI_DEVICE_ID_ADDIDATA_APCIe7500 0x7012 +#define PCI_DEVICE_ID_ADDIDATA_APCIe7800 0x7013 #define PCI_VENDOR_ID_PDC 0x15e9 @@ -2215,10 +2260,20 @@ #define PCI_VENDOR_ID_TOPSPIN 0x1867 +#define PCI_VENDOR_ID_SILAN 0x1904 + #define PCI_VENDOR_ID_TDI 0x192E #define PCI_DEVICE_ID_TDI_EHCI 0x0101 #define PCI_VENDOR_ID_FREESCALE 0x1957 +#define PCI_DEVICE_ID_MPC8315E 0x00b4 +#define PCI_DEVICE_ID_MPC8315 0x00b5 +#define PCI_DEVICE_ID_MPC8314E 0x00b6 +#define PCI_DEVICE_ID_MPC8314 0x00b7 +#define PCI_DEVICE_ID_MPC8378E 0x00c4 +#define PCI_DEVICE_ID_MPC8378 0x00c5 +#define PCI_DEVICE_ID_MPC8377E 0x00c6 +#define PCI_DEVICE_ID_MPC8377 0x00c7 #define PCI_DEVICE_ID_MPC8548E 0x0012 #define PCI_DEVICE_ID_MPC8548 0x0013 #define PCI_DEVICE_ID_MPC8543E 0x0014 @@ -2226,6 +2281,8 @@ #define PCI_DEVICE_ID_MPC8547E 0x0018 #define PCI_DEVICE_ID_MPC8545E 0x0019 #define PCI_DEVICE_ID_MPC8545 0x001a +#define PCI_DEVICE_ID_MPC8569E 0x0061 +#define PCI_DEVICE_ID_MPC8569 0x0060 #define PCI_DEVICE_ID_MPC8568E 0x0020 #define PCI_DEVICE_ID_MPC8568 0x0021 #define PCI_DEVICE_ID_MPC8567E 0x0022 @@ -2238,6 +2295,22 @@ #define PCI_DEVICE_ID_MPC8572 0x0041 #define PCI_DEVICE_ID_MPC8536E 0x0050 #define PCI_DEVICE_ID_MPC8536 0x0051 +#define PCI_DEVICE_ID_P2020E 0x0070 +#define PCI_DEVICE_ID_P2020 0x0071 +#define PCI_DEVICE_ID_P2010E 0x0078 +#define PCI_DEVICE_ID_P2010 0x0079 +#define PCI_DEVICE_ID_P1020E 0x0100 +#define PCI_DEVICE_ID_P1020 0x0101 +#define PCI_DEVICE_ID_P1011E 0x0108 +#define PCI_DEVICE_ID_P1011 0x0109 +#define PCI_DEVICE_ID_P1022E 0x0110 +#define PCI_DEVICE_ID_P1022 0x0111 +#define PCI_DEVICE_ID_P1013E 0x0118 +#define PCI_DEVICE_ID_P1013 0x0119 +#define PCI_DEVICE_ID_P4080E 0x0400 +#define PCI_DEVICE_ID_P4080 0x0401 +#define PCI_DEVICE_ID_P4040E 0x0408 +#define PCI_DEVICE_ID_P4040 0x0409 #define PCI_DEVICE_ID_MPC8641 0x7010 #define PCI_DEVICE_ID_MPC8641D 0x7011 #define PCI_DEVICE_ID_MPC8610 0x7018 @@ -2251,6 +2324,7 @@ #define PCI_VENDOR_ID_JMICRON 0x197B #define PCI_DEVICE_ID_JMICRON_JMB360 0x2360 #define PCI_DEVICE_ID_JMICRON_JMB361 0x2361 +#define PCI_DEVICE_ID_JMICRON_JMB362 0x2362 #define PCI_DEVICE_ID_JMICRON_JMB363 0x2363 #define PCI_DEVICE_ID_JMICRON_JMB365 0x2365 #define PCI_DEVICE_ID_JMICRON_JMB366 0x2366 @@ -2263,6 +2337,10 @@ #define PCI_DEVICE_ID_KORENIX_JETCARDF0 0x1600 #define PCI_DEVICE_ID_KORENIX_JETCARDF1 0x16ff +#define PCI_VENDOR_ID_QMI 0x1a32 + +#define PCI_VENDOR_ID_AZWAVE 0x1a3b + #define PCI_VENDOR_ID_TEKRAM 0x1de1 #define PCI_DEVICE_ID_TEKRAM_DC290 0xdc29 @@ -2342,6 +2420,9 @@ #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 +#define PCI_DEVICE_ID_INTEL_CPT_SMBUS 0x1c22 +#define PCI_DEVICE_ID_INTEL_CPT_LPC1 0x1c42 +#define PCI_DEVICE_ID_INTEL_CPT_LPC2 0x1c43 #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 @@ -2373,6 +2454,7 @@ #define PCI_DEVICE_ID_INTEL_82801CA_12 0x248c #define PCI_DEVICE_ID_INTEL_82801DB_0 0x24c0 #define PCI_DEVICE_ID_INTEL_82801DB_1 0x24c1 +#define PCI_DEVICE_ID_INTEL_82801DB_2 0x24c2 #define PCI_DEVICE_ID_INTEL_82801DB_3 0x24c3 #define PCI_DEVICE_ID_INTEL_82801DB_5 0x24c5 #define PCI_DEVICE_ID_INTEL_82801DB_6 0x24c6 @@ -2463,6 +2545,8 @@ #define PCI_DEVICE_ID_INTEL_IOAT_TBG3 0x3433 #define PCI_DEVICE_ID_INTEL_82830_HB 0x3575 #define PCI_DEVICE_ID_INTEL_82830_CGC 0x3577 +#define PCI_DEVICE_ID_INTEL_82854_HB 0x358c +#define PCI_DEVICE_ID_INTEL_82854_IG 0x358e #define PCI_DEVICE_ID_INTEL_82855GM_HB 0x3580 #define PCI_DEVICE_ID_INTEL_82855GM_IG 0x3582 #define PCI_DEVICE_ID_INTEL_E7520_MCH 0x3590 @@ -2476,6 +2560,16 @@ #define PCI_DEVICE_ID_INTEL_E7525_MCH 0x359e #define PCI_DEVICE_ID_INTEL_IOAT_CNB 0x360b #define PCI_DEVICE_ID_INTEL_FBD_CNB 0x360c +#define PCI_DEVICE_ID_INTEL_IOAT_JSF0 0x3710 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF1 0x3711 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF2 0x3712 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF3 0x3713 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF4 0x3714 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF5 0x3715 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF6 0x3716 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF7 0x3717 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF8 0x3718 +#define PCI_DEVICE_ID_INTEL_IOAT_JSF9 0x3719 #define PCI_DEVICE_ID_INTEL_ICH10_0 0x3a14 #define PCI_DEVICE_ID_INTEL_ICH10_1 0x3a16 #define PCI_DEVICE_ID_INTEL_ICH10_2 0x3a18 @@ -2606,6 +2700,7 @@ #define PCI_DEVICE_ID_NETMOS_9835 0x9835 #define PCI_DEVICE_ID_NETMOS_9845 0x9845 #define PCI_DEVICE_ID_NETMOS_9855 0x9855 +#define PCI_DEVICE_ID_NETMOS_9901 0x9901 #define PCI_VENDOR_ID_3COM_2 0xa727 diff --git a/libdde-linux26/contrib/include/linux/phy.h b/libdde-linux26/contrib/include/linux/phy.h index d7e54d98..b1368b8f 100644 --- a/libdde-linux26/contrib/include/linux/phy.h +++ b/libdde-linux26/contrib/include/linux/phy.h @@ -79,7 +79,7 @@ typedef enum { * Need to be a little smaller than phydev->dev.bus_id to leave room * for the ":%02x" */ -#define MII_BUS_ID_SIZE (BUS_ID_SIZE - 3) +#define MII_BUS_ID_SIZE (20 - 3) /* * The Bus class for PHYs. Devices which provide access to @@ -315,8 +315,7 @@ struct phy_device { /* Interrupt and Polling infrastructure */ struct work_struct phy_queue; - struct work_struct state_queue; - struct timer_list phy_timer; + struct delayed_work state_queue; atomic_t irq_disable; struct mutex lock; @@ -389,6 +388,12 @@ struct phy_driver { /* Enables or disables interrupts */ int (*config_intr)(struct phy_device *phydev); + /* + * Checks if the PHY generated an interrupt. + * For multi-PHY devices with shared PHY interrupt pin + */ + int (*did_interrupt)(struct phy_device *phydev); + /* Clears up any memory if needed */ void (*remove)(struct phy_device *phydev); @@ -402,7 +407,7 @@ struct phy_driver { /* A Structure for boards to register fixups with the PHY Lib */ struct phy_fixup { struct list_head list; - char bus_id[BUS_ID_SIZE]; + char bus_id[20]; u32 phy_uid; u32 phy_uid_mask; int (*run)(struct phy_device *phydev); @@ -439,10 +444,16 @@ static inline int phy_write(struct phy_device *phydev, u16 regnum, u16 val) int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id); struct phy_device* get_phy_device(struct mii_bus *bus, int addr); +int phy_device_register(struct phy_device *phy); int phy_clear_interrupt(struct phy_device *phydev); int phy_config_interrupt(struct phy_device *phydev, u32 interrupts); +int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, + u32 flags, phy_interface_t interface); struct phy_device * phy_attach(struct net_device *dev, const char *bus_id, u32 flags, phy_interface_t interface); +int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, + void (*handler)(struct net_device *), u32 flags, + phy_interface_t interface); struct phy_device * phy_connect(struct net_device *dev, const char *bus_id, void (*handler)(struct net_device *), u32 flags, phy_interface_t interface); diff --git a/libdde-linux26/contrib/include/linux/skbuff.h b/libdde-linux26/contrib/include/linux/skbuff.h index a9e9534d..745f6159 100644 --- a/libdde-linux26/contrib/include/linux/skbuff.h +++ b/libdde-linux26/contrib/include/linux/skbuff.h @@ -142,6 +142,9 @@ struct skb_shared_info { atomic_t dataref; unsigned short nr_frags; unsigned short gso_size; +#ifdef CONFIG_HAS_DMA + dma_addr_t dma_head; +#endif /* Warning: this field is not always filled in (UFO)! */ unsigned short gso_segs; unsigned short gso_type; @@ -152,7 +155,7 @@ struct skb_shared_info { struct sk_buff *frag_list; skb_frag_t frags[MAX_SKB_FRAGS]; #ifdef CONFIG_HAS_DMA - dma_addr_t dma_maps[MAX_SKB_FRAGS + 1]; + dma_addr_t dma_maps[MAX_SKB_FRAGS]; #endif }; @@ -1900,6 +1903,21 @@ static inline void skb_copy_queue_mapping(struct sk_buff *to, const struct sk_bu to->queue_mapping = from->queue_mapping; } +static inline void skb_record_rx_queue(struct sk_buff *skb, u16 rx_queue) +{ + skb->queue_mapping = rx_queue + 1; +} + +static inline u16 skb_get_rx_queue(struct sk_buff *skb) +{ + return skb->queue_mapping - 1; +} + +static inline bool skb_rx_queue_recorded(struct sk_buff *skb) +{ + return (skb->queue_mapping != 0); +} + #ifdef CONFIG_XFRM static inline struct sec_path *skb_sec_path(struct sk_buff *skb) { diff --git a/libdde-linux26/contrib/include/linux/workqueue.h b/libdde-linux26/contrib/include/linux/workqueue.h index 3cd51e57..cf24c20d 100644 --- a/libdde-linux26/contrib/include/linux/workqueue.h +++ b/libdde-linux26/contrib/include/linux/workqueue.h @@ -41,6 +41,11 @@ struct delayed_work { struct timer_list timer; }; +static inline struct delayed_work *to_delayed_work(struct work_struct *work) +{ + return container_of(work, struct delayed_work, work); +} + struct execute_work { struct work_struct work; }; @@ -89,7 +94,7 @@ struct execute_work { /* * initialize all of a work item in one go * - * NOTE! No point in using "atomic_long_set()": useing a direct + * NOTE! No point in using "atomic_long_set()": using a direct * assignment of the work data initializer allows the compiler * to generate better code. */ @@ -202,6 +207,7 @@ extern int queue_delayed_work_on(int cpu, struct workqueue_struct *wq, extern void flush_workqueue(struct workqueue_struct *wq); extern void flush_scheduled_work(void); +extern void flush_delayed_work(struct delayed_work *work); extern int schedule_work(struct work_struct *work); extern int schedule_work_on(int cpu, struct work_struct *work); @@ -235,6 +241,21 @@ static inline int cancel_delayed_work(struct delayed_work *work) return ret; } +/* + * Like above, but uses del_timer() instead of del_timer_sync(). This means, + * if it returns 0 the timer function may be running and the queueing is in + * progress. + */ +static inline int __cancel_delayed_work(struct delayed_work *work) +{ + int ret; + + ret = del_timer(&work->timer); + if (ret) + work_clear_pending(&work->work); + return ret; +} + extern int cancel_delayed_work_sync(struct delayed_work *work); /* Obsolete. use cancel_delayed_work_sync() */ diff --git a/libdde-linux26/contrib/include/net/ethoc.h b/libdde-linux26/contrib/include/net/ethoc.h new file mode 100644 index 00000000..96f3789b --- /dev/null +++ b/libdde-linux26/contrib/include/net/ethoc.h @@ -0,0 +1,22 @@ +/* + * linux/include/net/ethoc.h + * + * Copyright (C) 2008-2009 Avionic Design GmbH + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * Written by Thierry Reding <thierry.reding@avionic-design.de> + */ + +#ifndef LINUX_NET_ETHOC_H +#define LINUX_NET_ETHOC_H 1 + +struct ethoc_platform_data { + u8 hwaddr[IFHWADDRLEN]; + s8 phy_id; +}; + +#endif /* !LINUX_NET_ETHOC_H */ + diff --git a/libdde-linux26/contrib/kernel/rcuclassic.c b/libdde-linux26/contrib/kernel/rcuclassic.c new file mode 100644 index 00000000..654c640a --- /dev/null +++ b/libdde-linux26/contrib/kernel/rcuclassic.c @@ -0,0 +1,788 @@ +/* + * Read-Copy Update mechanism for mutual exclusion + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright IBM Corporation, 2001 + * + * Authors: Dipankar Sarma <dipankar@in.ibm.com> + * Manfred Spraul <manfred@colorfullife.com> + * + * Based on the original work by Paul McKenney <paulmck@us.ibm.com> + * and inputs from Rusty Russell, Andrea Arcangeli and Andi Kleen. + * Papers: + * http://www.rdrop.com/users/paulmck/paper/rclockpdcsproof.pdf + * http://lse.sourceforge.net/locking/rclock_OLS.2001.05.01c.sc.pdf (OLS2001) + * + * For detailed explanation of Read-Copy Update mechanism see - + * Documentation/RCU + * + */ +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/spinlock.h> +#include <linux/smp.h> +#include <linux/rcupdate.h> +#include <linux/interrupt.h> +#include <linux/sched.h> +#include <asm/atomic.h> +#include <linux/bitops.h> +#include <linux/module.h> +#include <linux/completion.h> +#include <linux/moduleparam.h> +#include <linux/percpu.h> +#include <linux/notifier.h> +#include <linux/cpu.h> +#include <linux/mutex.h> +#include <linux/time.h> + +#ifdef CONFIG_DEBUG_LOCK_ALLOC +static struct lock_class_key rcu_lock_key; +struct lockdep_map rcu_lock_map = + STATIC_LOCKDEP_MAP_INIT("rcu_read_lock", &rcu_lock_key); +EXPORT_SYMBOL_GPL(rcu_lock_map); +#endif + + +/* Definition for rcupdate control block. */ +static struct rcu_ctrlblk rcu_ctrlblk = { + .cur = -300, + .completed = -300, + .pending = -300, + .lock = __SPIN_LOCK_UNLOCKED(&rcu_ctrlblk.lock), + .cpumask = CPU_BITS_NONE, +}; +static struct rcu_ctrlblk rcu_bh_ctrlblk = { + .cur = -300, + .completed = -300, + .pending = -300, + .lock = __SPIN_LOCK_UNLOCKED(&rcu_bh_ctrlblk.lock), + .cpumask = CPU_BITS_NONE, +}; + +DEFINE_PER_CPU(struct rcu_data, rcu_data) = { 0L }; +DEFINE_PER_CPU(struct rcu_data, rcu_bh_data) = { 0L }; + +static int blimit = 10; +static int qhimark = 10000; +static int qlowmark = 100; + +#ifdef CONFIG_SMP +static void force_quiescent_state(struct rcu_data *rdp, + struct rcu_ctrlblk *rcp) +{ + int cpu; + unsigned long flags; + + set_need_resched(); + spin_lock_irqsave(&rcp->lock, flags); + if (unlikely(!rcp->signaled)) { + rcp->signaled = 1; + /* + * Don't send IPI to itself. With irqs disabled, + * rdp->cpu is the current cpu. + * + * cpu_online_mask is updated by the _cpu_down() + * using __stop_machine(). Since we're in irqs disabled + * section, __stop_machine() is not exectuting, hence + * the cpu_online_mask is stable. + * + * However, a cpu might have been offlined _just_ before + * we disabled irqs while entering here. + * And rcu subsystem might not yet have handled the CPU_DEAD + * notification, leading to the offlined cpu's bit + * being set in the rcp->cpumask. + * + * Hence cpumask = (rcp->cpumask & cpu_online_mask) to prevent + * sending smp_reschedule() to an offlined CPU. + */ + for_each_cpu_and(cpu, + to_cpumask(rcp->cpumask), cpu_online_mask) { + if (cpu != rdp->cpu) + smp_send_reschedule(cpu); + } + } + spin_unlock_irqrestore(&rcp->lock, flags); +} +#else +static inline void force_quiescent_state(struct rcu_data *rdp, + struct rcu_ctrlblk *rcp) +{ + set_need_resched(); +} +#endif + +static void __call_rcu(struct rcu_head *head, struct rcu_ctrlblk *rcp, + struct rcu_data *rdp) +{ + long batch; + + head->next = NULL; + smp_mb(); /* Read of rcu->cur must happen after any change by caller. */ + + /* + * Determine the batch number of this callback. + * + * Using ACCESS_ONCE to avoid the following error when gcc eliminates + * local variable "batch" and emits codes like this: + * 1) rdp->batch = rcp->cur + 1 # gets old value + * ...... + * 2)rcu_batch_after(rcp->cur + 1, rdp->batch) # gets new value + * then [*nxttail[0], *nxttail[1]) may contain callbacks + * that batch# = rdp->batch, see the comment of struct rcu_data. + */ + batch = ACCESS_ONCE(rcp->cur) + 1; + + if (rdp->nxtlist && rcu_batch_after(batch, rdp->batch)) { + /* process callbacks */ + rdp->nxttail[0] = rdp->nxttail[1]; + rdp->nxttail[1] = rdp->nxttail[2]; + if (rcu_batch_after(batch - 1, rdp->batch)) + rdp->nxttail[0] = rdp->nxttail[2]; + } + + rdp->batch = batch; + *rdp->nxttail[2] = head; + rdp->nxttail[2] = &head->next; + + if (unlikely(++rdp->qlen > qhimark)) { + rdp->blimit = INT_MAX; + force_quiescent_state(rdp, &rcu_ctrlblk); + } +} + +#ifdef CONFIG_RCU_CPU_STALL_DETECTOR + +static void record_gp_stall_check_time(struct rcu_ctrlblk *rcp) +{ + rcp->gp_start = jiffies; + rcp->jiffies_stall = jiffies + RCU_SECONDS_TILL_STALL_CHECK; +} + +static void print_other_cpu_stall(struct rcu_ctrlblk *rcp) +{ + int cpu; + long delta; + unsigned long flags; + + /* Only let one CPU complain about others per time interval. */ + + spin_lock_irqsave(&rcp->lock, flags); + delta = jiffies - rcp->jiffies_stall; + if (delta < 2 || rcp->cur != rcp->completed) { + spin_unlock_irqrestore(&rcp->lock, flags); + return; + } + rcp->jiffies_stall = jiffies + RCU_SECONDS_TILL_STALL_RECHECK; + spin_unlock_irqrestore(&rcp->lock, flags); + + /* OK, time to rat on our buddy... */ + + printk(KERN_ERR "INFO: RCU detected CPU stalls:"); + for_each_possible_cpu(cpu) { + if (cpumask_test_cpu(cpu, to_cpumask(rcp->cpumask))) + printk(" %d", cpu); + } + printk(" (detected by %d, t=%ld jiffies)\n", + smp_processor_id(), (long)(jiffies - rcp->gp_start)); +} + +static void print_cpu_stall(struct rcu_ctrlblk *rcp) +{ + unsigned long flags; + + printk(KERN_ERR "INFO: RCU detected CPU %d stall (t=%lu/%lu jiffies)\n", + smp_processor_id(), jiffies, + jiffies - rcp->gp_start); + dump_stack(); + spin_lock_irqsave(&rcp->lock, flags); + if ((long)(jiffies - rcp->jiffies_stall) >= 0) + rcp->jiffies_stall = + jiffies + RCU_SECONDS_TILL_STALL_RECHECK; + spin_unlock_irqrestore(&rcp->lock, flags); + set_need_resched(); /* kick ourselves to get things going. */ +} + +static void check_cpu_stall(struct rcu_ctrlblk *rcp) +{ + long delta; + + delta = jiffies - rcp->jiffies_stall; + if (cpumask_test_cpu(smp_processor_id(), to_cpumask(rcp->cpumask)) && + delta >= 0) { + + /* We haven't checked in, so go dump stack. */ + print_cpu_stall(rcp); + + } else if (rcp->cur != rcp->completed && delta >= 2) { + + /* They had two seconds to dump stack, so complain. */ + print_other_cpu_stall(rcp); + } +} + +#else /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ + +static void record_gp_stall_check_time(struct rcu_ctrlblk *rcp) +{ +} + +static inline void check_cpu_stall(struct rcu_ctrlblk *rcp) +{ +} + +#endif /* #else #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ + +/** + * call_rcu - Queue an RCU callback for invocation after a grace period. + * @head: structure to be used for queueing the RCU updates. + * @func: actual update function to be invoked after the grace period + * + * The update function will be invoked some time after a full grace + * period elapses, in other words after all currently executing RCU + * read-side critical sections have completed. RCU read-side critical + * sections are delimited by rcu_read_lock() and rcu_read_unlock(), + * and may be nested. + */ +void call_rcu(struct rcu_head *head, + void (*func)(struct rcu_head *rcu)) +{ + unsigned long flags; + + head->func = func; + local_irq_save(flags); + __call_rcu(head, &rcu_ctrlblk, &__get_cpu_var(rcu_data)); + local_irq_restore(flags); +} +EXPORT_SYMBOL_GPL(call_rcu); + +/** + * call_rcu_bh - Queue an RCU for invocation after a quicker grace period. + * @head: structure to be used for queueing the RCU updates. + * @func: actual update function to be invoked after the grace period + * + * The update function will be invoked some time after a full grace + * period elapses, in other words after all currently executing RCU + * read-side critical sections have completed. call_rcu_bh() assumes + * that the read-side critical sections end on completion of a softirq + * handler. This means that read-side critical sections in process + * context must not be interrupted by softirqs. This interface is to be + * used when most of the read-side critical sections are in softirq context. + * RCU read-side critical sections are delimited by rcu_read_lock() and + * rcu_read_unlock(), * if in interrupt context or rcu_read_lock_bh() + * and rcu_read_unlock_bh(), if in process context. These may be nested. + */ +void call_rcu_bh(struct rcu_head *head, + void (*func)(struct rcu_head *rcu)) +{ + unsigned long flags; + + head->func = func; + local_irq_save(flags); + __call_rcu(head, &rcu_bh_ctrlblk, &__get_cpu_var(rcu_bh_data)); + local_irq_restore(flags); +} +EXPORT_SYMBOL_GPL(call_rcu_bh); + +/* + * Return the number of RCU batches processed thus far. Useful + * for debug and statistics. + */ +long rcu_batches_completed(void) +{ + return rcu_ctrlblk.completed; +} +EXPORT_SYMBOL_GPL(rcu_batches_completed); + +/* + * Return the number of RCU batches processed thus far. Useful + * for debug and statistics. + */ +long rcu_batches_completed_bh(void) +{ + return rcu_bh_ctrlblk.completed; +} +EXPORT_SYMBOL_GPL(rcu_batches_completed_bh); + +/* Raises the softirq for processing rcu_callbacks. */ +static inline void raise_rcu_softirq(void) +{ + raise_softirq(RCU_SOFTIRQ); +} + +/* + * Invoke the completed RCU callbacks. They are expected to be in + * a per-cpu list. + */ +static void rcu_do_batch(struct rcu_data *rdp) +{ + unsigned long flags; + struct rcu_head *next, *list; + int count = 0; + + list = rdp->donelist; + while (list) { + next = list->next; + prefetch(next); + list->func(list); + list = next; + if (++count >= rdp->blimit) + break; + } + rdp->donelist = list; + + local_irq_save(flags); + rdp->qlen -= count; + local_irq_restore(flags); + if (rdp->blimit == INT_MAX && rdp->qlen <= qlowmark) + rdp->blimit = blimit; + + if (!rdp->donelist) + rdp->donetail = &rdp->donelist; + else + raise_rcu_softirq(); +} + +/* + * Grace period handling: + * The grace period handling consists out of two steps: + * - A new grace period is started. + * This is done by rcu_start_batch. The start is not broadcasted to + * all cpus, they must pick this up by comparing rcp->cur with + * rdp->quiescbatch. All cpus are recorded in the + * rcu_ctrlblk.cpumask bitmap. + * - All cpus must go through a quiescent state. + * Since the start of the grace period is not broadcasted, at least two + * calls to rcu_check_quiescent_state are required: + * The first call just notices that a new grace period is running. The + * following calls check if there was a quiescent state since the beginning + * of the grace period. If so, it updates rcu_ctrlblk.cpumask. If + * the bitmap is empty, then the grace period is completed. + * rcu_check_quiescent_state calls rcu_start_batch(0) to start the next grace + * period (if necessary). + */ + +/* + * Register a new batch of callbacks, and start it up if there is currently no + * active batch and the batch to be registered has not already occurred. + * Caller must hold rcu_ctrlblk.lock. + */ +static void rcu_start_batch(struct rcu_ctrlblk *rcp) +{ + if (rcp->cur != rcp->pending && + rcp->completed == rcp->cur) { + rcp->cur++; + record_gp_stall_check_time(rcp); + + /* + * Accessing nohz_cpu_mask before incrementing rcp->cur needs a + * Barrier Otherwise it can cause tickless idle CPUs to be + * included in rcp->cpumask, which will extend graceperiods + * unnecessarily. + */ + smp_mb(); + cpumask_andnot(to_cpumask(rcp->cpumask), + cpu_online_mask, nohz_cpu_mask); + + rcp->signaled = 0; + } +} + +/* + * cpu went through a quiescent state since the beginning of the grace period. + * Clear it from the cpu mask and complete the grace period if it was the last + * cpu. Start another grace period if someone has further entries pending + */ +static void cpu_quiet(int cpu, struct rcu_ctrlblk *rcp) +{ + cpumask_clear_cpu(cpu, to_cpumask(rcp->cpumask)); + if (cpumask_empty(to_cpumask(rcp->cpumask))) { + /* batch completed ! */ + rcp->completed = rcp->cur; + rcu_start_batch(rcp); + } +} + +/* + * Check if the cpu has gone through a quiescent state (say context + * switch). If so and if it already hasn't done so in this RCU + * quiescent cycle, then indicate that it has done so. + */ +static void rcu_check_quiescent_state(struct rcu_ctrlblk *rcp, + struct rcu_data *rdp) +{ + unsigned long flags; + + if (rdp->quiescbatch != rcp->cur) { + /* start new grace period: */ + rdp->qs_pending = 1; + rdp->passed_quiesc = 0; + rdp->quiescbatch = rcp->cur; + return; + } + + /* Grace period already completed for this cpu? + * qs_pending is checked instead of the actual bitmap to avoid + * cacheline trashing. + */ + if (!rdp->qs_pending) + return; + + /* + * Was there a quiescent state since the beginning of the grace + * period? If no, then exit and wait for the next call. + */ + if (!rdp->passed_quiesc) + return; + rdp->qs_pending = 0; + + spin_lock_irqsave(&rcp->lock, flags); + /* + * rdp->quiescbatch/rcp->cur and the cpu bitmap can come out of sync + * during cpu startup. Ignore the quiescent state. + */ + if (likely(rdp->quiescbatch == rcp->cur)) + cpu_quiet(rdp->cpu, rcp); + + spin_unlock_irqrestore(&rcp->lock, flags); +} + + +#ifdef CONFIG_HOTPLUG_CPU + +/* warning! helper for rcu_offline_cpu. do not use elsewhere without reviewing + * locking requirements, the list it's pulling from has to belong to a cpu + * which is dead and hence not processing interrupts. + */ +static void rcu_move_batch(struct rcu_data *this_rdp, struct rcu_head *list, + struct rcu_head **tail, long batch) +{ + unsigned long flags; + + if (list) { + local_irq_save(flags); + this_rdp->batch = batch; + *this_rdp->nxttail[2] = list; + this_rdp->nxttail[2] = tail; + local_irq_restore(flags); + } +} + +static void __rcu_offline_cpu(struct rcu_data *this_rdp, + struct rcu_ctrlblk *rcp, struct rcu_data *rdp) +{ + unsigned long flags; + + /* + * if the cpu going offline owns the grace period + * we can block indefinitely waiting for it, so flush + * it here + */ + spin_lock_irqsave(&rcp->lock, flags); + if (rcp->cur != rcp->completed) + cpu_quiet(rdp->cpu, rcp); + rcu_move_batch(this_rdp, rdp->donelist, rdp->donetail, rcp->cur + 1); + rcu_move_batch(this_rdp, rdp->nxtlist, rdp->nxttail[2], rcp->cur + 1); + spin_unlock(&rcp->lock); + + this_rdp->qlen += rdp->qlen; + local_irq_restore(flags); +} + +static void rcu_offline_cpu(int cpu) +{ + struct rcu_data *this_rdp = &get_cpu_var(rcu_data); + struct rcu_data *this_bh_rdp = &get_cpu_var(rcu_bh_data); + + __rcu_offline_cpu(this_rdp, &rcu_ctrlblk, + &per_cpu(rcu_data, cpu)); + __rcu_offline_cpu(this_bh_rdp, &rcu_bh_ctrlblk, + &per_cpu(rcu_bh_data, cpu)); + put_cpu_var(rcu_data); + put_cpu_var(rcu_bh_data); +} + +#else + +static void rcu_offline_cpu(int cpu) +{ +} + +#endif + +/* + * This does the RCU processing work from softirq context. + */ +static void __rcu_process_callbacks(struct rcu_ctrlblk *rcp, + struct rcu_data *rdp) +{ + unsigned long flags; + long completed_snap; + + if (rdp->nxtlist) { + local_irq_save(flags); + completed_snap = ACCESS_ONCE(rcp->completed); + + /* + * move the other grace-period-completed entries to + * [rdp->nxtlist, *rdp->nxttail[0]) temporarily + */ + if (!rcu_batch_before(completed_snap, rdp->batch)) + rdp->nxttail[0] = rdp->nxttail[1] = rdp->nxttail[2]; + else if (!rcu_batch_before(completed_snap, rdp->batch - 1)) + rdp->nxttail[0] = rdp->nxttail[1]; + + /* + * the grace period for entries in + * [rdp->nxtlist, *rdp->nxttail[0]) has completed and + * move these entries to donelist + */ + if (rdp->nxttail[0] != &rdp->nxtlist) { + *rdp->donetail = rdp->nxtlist; + rdp->donetail = rdp->nxttail[0]; + rdp->nxtlist = *rdp->nxttail[0]; + *rdp->donetail = NULL; + + if (rdp->nxttail[1] == rdp->nxttail[0]) + rdp->nxttail[1] = &rdp->nxtlist; + if (rdp->nxttail[2] == rdp->nxttail[0]) + rdp->nxttail[2] = &rdp->nxtlist; + rdp->nxttail[0] = &rdp->nxtlist; + } + + local_irq_restore(flags); + + if (rcu_batch_after(rdp->batch, rcp->pending)) { + unsigned long flags2; + + /* and start it/schedule start if it's a new batch */ + spin_lock_irqsave(&rcp->lock, flags2); + if (rcu_batch_after(rdp->batch, rcp->pending)) { + rcp->pending = rdp->batch; + rcu_start_batch(rcp); + } + spin_unlock_irqrestore(&rcp->lock, flags2); + } + } + + rcu_check_quiescent_state(rcp, rdp); + if (rdp->donelist) + rcu_do_batch(rdp); +} + +static void rcu_process_callbacks(struct softirq_action *unused) +{ + /* + * Memory references from any prior RCU read-side critical sections + * executed by the interrupted code must be see before any RCU + * grace-period manupulations below. + */ + + smp_mb(); /* See above block comment. */ + + __rcu_process_callbacks(&rcu_ctrlblk, &__get_cpu_var(rcu_data)); + __rcu_process_callbacks(&rcu_bh_ctrlblk, &__get_cpu_var(rcu_bh_data)); + + /* + * Memory references from any later RCU read-side critical sections + * executed by the interrupted code must be see after any RCU + * grace-period manupulations above. + */ + + smp_mb(); /* See above block comment. */ +} + +static int __rcu_pending(struct rcu_ctrlblk *rcp, struct rcu_data *rdp) +{ + /* Check for CPU stalls, if enabled. */ + check_cpu_stall(rcp); + + if (rdp->nxtlist) { + long completed_snap = ACCESS_ONCE(rcp->completed); + + /* + * This cpu has pending rcu entries and the grace period + * for them has completed. + */ + if (!rcu_batch_before(completed_snap, rdp->batch)) + return 1; + if (!rcu_batch_before(completed_snap, rdp->batch - 1) && + rdp->nxttail[0] != rdp->nxttail[1]) + return 1; + if (rdp->nxttail[0] != &rdp->nxtlist) + return 1; + + /* + * This cpu has pending rcu entries and the new batch + * for then hasn't been started nor scheduled start + */ + if (rcu_batch_after(rdp->batch, rcp->pending)) + return 1; + } + + /* This cpu has finished callbacks to invoke */ + if (rdp->donelist) + return 1; + + /* The rcu core waits for a quiescent state from the cpu */ + if (rdp->quiescbatch != rcp->cur || rdp->qs_pending) + return 1; + + /* nothing to do */ + return 0; +} + +/* + * Check to see if there is any immediate RCU-related work to be done + * by the current CPU, returning 1 if so. This function is part of the + * RCU implementation; it is -not- an exported member of the RCU API. + */ +int rcu_pending(int cpu) +{ + return __rcu_pending(&rcu_ctrlblk, &per_cpu(rcu_data, cpu)) || + __rcu_pending(&rcu_bh_ctrlblk, &per_cpu(rcu_bh_data, cpu)); +} + +/* + * Check to see if any future RCU-related work will need to be done + * by the current CPU, even if none need be done immediately, returning + * 1 if so. This function is part of the RCU implementation; it is -not- + * an exported member of the RCU API. + */ +int rcu_needs_cpu(int cpu) +{ + struct rcu_data *rdp = &per_cpu(rcu_data, cpu); + struct rcu_data *rdp_bh = &per_cpu(rcu_bh_data, cpu); + + return !!rdp->nxtlist || !!rdp_bh->nxtlist || rcu_pending(cpu); +} + +/* + * Top-level function driving RCU grace-period detection, normally + * invoked from the scheduler-clock interrupt. This function simply + * increments counters that are read only from softirq by this same + * CPU, so there are no memory barriers required. + */ +void rcu_check_callbacks(int cpu, int user) +{ + if (user || + (idle_cpu(cpu) && rcu_scheduler_active && + !in_softirq() && hardirq_count() <= (1 << HARDIRQ_SHIFT))) { + + /* + * Get here if this CPU took its interrupt from user + * mode or from the idle loop, and if this is not a + * nested interrupt. In this case, the CPU is in + * a quiescent state, so count it. + * + * Also do a memory barrier. This is needed to handle + * the case where writes from a preempt-disable section + * of code get reordered into schedule() by this CPU's + * write buffer. The memory barrier makes sure that + * the rcu_qsctr_inc() and rcu_bh_qsctr_inc() are see + * by other CPUs to happen after any such write. + */ + + smp_mb(); /* See above block comment. */ + rcu_qsctr_inc(cpu); + rcu_bh_qsctr_inc(cpu); + + } else if (!in_softirq()) { + + /* + * Get here if this CPU did not take its interrupt from + * softirq, in other words, if it is not interrupting + * a rcu_bh read-side critical section. This is an _bh + * critical section, so count it. The memory barrier + * is needed for the same reason as is the above one. + */ + + smp_mb(); /* See above block comment. */ + rcu_bh_qsctr_inc(cpu); + } + raise_rcu_softirq(); +} + +static void __cpuinit rcu_init_percpu_data(int cpu, struct rcu_ctrlblk *rcp, + struct rcu_data *rdp) +{ + unsigned long flags; + + spin_lock_irqsave(&rcp->lock, flags); + memset(rdp, 0, sizeof(*rdp)); + rdp->nxttail[0] = rdp->nxttail[1] = rdp->nxttail[2] = &rdp->nxtlist; + rdp->donetail = &rdp->donelist; + rdp->quiescbatch = rcp->completed; + rdp->qs_pending = 0; + rdp->cpu = cpu; + rdp->blimit = blimit; + spin_unlock_irqrestore(&rcp->lock, flags); +} + +static void __cpuinit rcu_online_cpu(int cpu) +{ + struct rcu_data *rdp = &per_cpu(rcu_data, cpu); + struct rcu_data *bh_rdp = &per_cpu(rcu_bh_data, cpu); + + rcu_init_percpu_data(cpu, &rcu_ctrlblk, rdp); + rcu_init_percpu_data(cpu, &rcu_bh_ctrlblk, bh_rdp); + open_softirq(RCU_SOFTIRQ, rcu_process_callbacks); +} + +static int __cpuinit rcu_cpu_notify(struct notifier_block *self, + unsigned long action, void *hcpu) +{ + long cpu = (long)hcpu; + + switch (action) { + case CPU_UP_PREPARE: + case CPU_UP_PREPARE_FROZEN: + rcu_online_cpu(cpu); + break; + case CPU_DEAD: + case CPU_DEAD_FROZEN: + rcu_offline_cpu(cpu); + break; + default: + break; + } + return NOTIFY_OK; +} + +static struct notifier_block __cpuinitdata rcu_nb = { + .notifier_call = rcu_cpu_notify, +}; + +/* + * Initializes rcu mechanism. Assumed to be called early. + * That is before local timer(SMP) or jiffie timer (uniproc) is setup. + * Note that rcu_qsctr and friends are implicitly + * initialized due to the choice of ``0'' for RCU_CTR_INVALID. + */ +void __init __rcu_init(void) +{ +#ifdef CONFIG_RCU_CPU_STALL_DETECTOR + printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n"); +#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */ + rcu_cpu_notify(&rcu_nb, CPU_UP_PREPARE, + (void *)(long)smp_processor_id()); + /* Register notifier for non-boot CPUs */ + register_cpu_notifier(&rcu_nb); +} + +module_param(blimit, int, 0); +module_param(qhimark, int, 0); +module_param(qlowmark, int, 0); diff --git a/libdde-linux26/contrib/kernel/rcupdate.c b/libdde-linux26/contrib/kernel/rcupdate.c index cae8a059..c6bfa1af 100644 --- a/libdde-linux26/contrib/kernel/rcupdate.c +++ b/libdde-linux26/contrib/kernel/rcupdate.c @@ -180,6 +180,7 @@ void __init rcu_init(void) { __rcu_init(); } +core_initcall(rcu_init); void rcu_scheduler_starting(void) { diff --git a/libdde-linux26/contrib/lib/devres.c b/libdde-linux26/contrib/lib/devres.c new file mode 100644 index 00000000..72c89090 --- /dev/null +++ b/libdde-linux26/contrib/lib/devres.c @@ -0,0 +1,351 @@ +#include <linux/pci.h> +#include <linux/io.h> +#include <linux/module.h> + +void devm_ioremap_release(struct device *dev, void *res) +{ + iounmap(*(void __iomem **)res); +} + +static int devm_ioremap_match(struct device *dev, void *res, void *match_data) +{ + return *(void **)res == match_data; +} + +/** + * devm_ioremap - Managed ioremap() + * @dev: Generic device to remap IO address for + * @offset: BUS offset to map + * @size: Size of map + * + * Managed ioremap(). Map is automatically unmapped on driver detach. + */ +void __iomem *devm_ioremap(struct device *dev, resource_size_t offset, + unsigned long size) +{ + void __iomem **ptr, *addr; + + ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return NULL; + + addr = ioremap(offset, size); + if (addr) { + *ptr = addr; + devres_add(dev, ptr); + } else + devres_free(ptr); + + return addr; +} +EXPORT_SYMBOL(devm_ioremap); + +/** + * devm_ioremap_nocache - Managed ioremap_nocache() + * @dev: Generic device to remap IO address for + * @offset: BUS offset to map + * @size: Size of map + * + * Managed ioremap_nocache(). Map is automatically unmapped on driver + * detach. + */ +void __iomem *devm_ioremap_nocache(struct device *dev, resource_size_t offset, + unsigned long size) +{ + void __iomem **ptr, *addr; + + ptr = devres_alloc(devm_ioremap_release, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return NULL; + + addr = ioremap_nocache(offset, size); + if (addr) { + *ptr = addr; + devres_add(dev, ptr); + } else + devres_free(ptr); + + return addr; +} +EXPORT_SYMBOL(devm_ioremap_nocache); + +/** + * devm_iounmap - Managed iounmap() + * @dev: Generic device to unmap for + * @addr: Address to unmap + * + * Managed iounmap(). @addr must have been mapped using devm_ioremap*(). + */ +void devm_iounmap(struct device *dev, void __iomem *addr) +{ + iounmap(addr); + WARN_ON(devres_destroy(dev, devm_ioremap_release, devm_ioremap_match, + (void *)addr)); +} +EXPORT_SYMBOL(devm_iounmap); + +#ifdef CONFIG_HAS_IOPORT +/* + * Generic iomap devres + */ +static void devm_ioport_map_release(struct device *dev, void *res) +{ + ioport_unmap(*(void __iomem **)res); +} + +static int devm_ioport_map_match(struct device *dev, void *res, + void *match_data) +{ + return *(void **)res == match_data; +} + +/** + * devm_ioport_map - Managed ioport_map() + * @dev: Generic device to map ioport for + * @port: Port to map + * @nr: Number of ports to map + * + * Managed ioport_map(). Map is automatically unmapped on driver + * detach. + */ +void __iomem * devm_ioport_map(struct device *dev, unsigned long port, + unsigned int nr) +{ + void __iomem **ptr, *addr; + + ptr = devres_alloc(devm_ioport_map_release, sizeof(*ptr), GFP_KERNEL); + if (!ptr) + return NULL; + + addr = ioport_map(port, nr); + if (addr) { + *ptr = addr; + devres_add(dev, ptr); + } else + devres_free(ptr); + + return addr; +} +EXPORT_SYMBOL(devm_ioport_map); + +/** + * devm_ioport_unmap - Managed ioport_unmap() + * @dev: Generic device to unmap for + * @addr: Address to unmap + * + * Managed ioport_unmap(). @addr must have been mapped using + * devm_ioport_map(). + */ +void devm_ioport_unmap(struct device *dev, void __iomem *addr) +{ + ioport_unmap(addr); + WARN_ON(devres_destroy(dev, devm_ioport_map_release, + devm_ioport_map_match, (void *)addr)); +} +EXPORT_SYMBOL(devm_ioport_unmap); + +#ifdef CONFIG_PCI +/* + * PCI iomap devres + */ +#define PCIM_IOMAP_MAX PCI_ROM_RESOURCE + +struct pcim_iomap_devres { + void __iomem *table[PCIM_IOMAP_MAX]; +}; + +static void pcim_iomap_release(struct device *gendev, void *res) +{ + struct pci_dev *dev = container_of(gendev, struct pci_dev, dev); + struct pcim_iomap_devres *this = res; + int i; + + for (i = 0; i < PCIM_IOMAP_MAX; i++) + if (this->table[i]) + pci_iounmap(dev, this->table[i]); +} + +/** + * pcim_iomap_table - access iomap allocation table + * @pdev: PCI device to access iomap table for + * + * Access iomap allocation table for @dev. If iomap table doesn't + * exist and @pdev is managed, it will be allocated. All iomaps + * recorded in the iomap table are automatically unmapped on driver + * detach. + * + * This function might sleep when the table is first allocated but can + * be safely called without context and guaranteed to succed once + * allocated. + */ +void __iomem * const * pcim_iomap_table(struct pci_dev *pdev) +{ + struct pcim_iomap_devres *dr, *new_dr; + + dr = devres_find(&pdev->dev, pcim_iomap_release, NULL, NULL); + if (dr) + return dr->table; + + new_dr = devres_alloc(pcim_iomap_release, sizeof(*new_dr), GFP_KERNEL); + if (!new_dr) + return NULL; + dr = devres_get(&pdev->dev, new_dr, NULL, NULL); + return dr->table; +} +EXPORT_SYMBOL(pcim_iomap_table); + +/** + * pcim_iomap - Managed pcim_iomap() + * @pdev: PCI device to iomap for + * @bar: BAR to iomap + * @maxlen: Maximum length of iomap + * + * Managed pci_iomap(). Map is automatically unmapped on driver + * detach. + */ +void __iomem * pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen) +{ + void __iomem **tbl; + + BUG_ON(bar >= PCIM_IOMAP_MAX); + + tbl = (void __iomem **)pcim_iomap_table(pdev); + if (!tbl || tbl[bar]) /* duplicate mappings not allowed */ + return NULL; + + tbl[bar] = pci_iomap(pdev, bar, maxlen); + return tbl[bar]; +} +EXPORT_SYMBOL(pcim_iomap); + +/** + * pcim_iounmap - Managed pci_iounmap() + * @pdev: PCI device to iounmap for + * @addr: Address to unmap + * + * Managed pci_iounmap(). @addr must have been mapped using pcim_iomap(). + */ +void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr) +{ + void __iomem **tbl; + int i; + + pci_iounmap(pdev, addr); + + tbl = (void __iomem **)pcim_iomap_table(pdev); + BUG_ON(!tbl); + + for (i = 0; i < PCIM_IOMAP_MAX; i++) + if (tbl[i] == addr) { + tbl[i] = NULL; + return; + } + WARN_ON(1); +} +EXPORT_SYMBOL(pcim_iounmap); + +/** + * pcim_iomap_regions - Request and iomap PCI BARs + * @pdev: PCI device to map IO resources for + * @mask: Mask of BARs to request and iomap + * @name: Name used when requesting regions + * + * Request and iomap regions specified by @mask. + */ +int pcim_iomap_regions(struct pci_dev *pdev, u16 mask, const char *name) +{ + void __iomem * const *iomap; + int i, rc; + + iomap = pcim_iomap_table(pdev); + if (!iomap) + return -ENOMEM; + + for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { + unsigned long len; + + if (!(mask & (1 << i))) + continue; + + rc = -EINVAL; + len = pci_resource_len(pdev, i); + if (!len) + goto err_inval; + + rc = pci_request_region(pdev, i, name); + if (rc) + goto err_inval; + + rc = -ENOMEM; + if (!pcim_iomap(pdev, i, 0)) + goto err_region; + } + + return 0; + + err_region: + pci_release_region(pdev, i); + err_inval: + while (--i >= 0) { + if (!(mask & (1 << i))) + continue; + pcim_iounmap(pdev, iomap[i]); + pci_release_region(pdev, i); + } + + return rc; +} +EXPORT_SYMBOL(pcim_iomap_regions); + +/** + * pcim_iomap_regions_request_all - Request all BARs and iomap specified ones + * @pdev: PCI device to map IO resources for + * @mask: Mask of BARs to iomap + * @name: Name used when requesting regions + * + * Request all PCI BARs and iomap regions specified by @mask. + */ +int pcim_iomap_regions_request_all(struct pci_dev *pdev, u16 mask, + const char *name) +{ + int request_mask = ((1 << 6) - 1) & ~mask; + int rc; + + rc = pci_request_selected_regions(pdev, request_mask, name); + if (rc) + return rc; + + rc = pcim_iomap_regions(pdev, mask, name); + if (rc) + pci_release_selected_regions(pdev, request_mask); + return rc; +} +EXPORT_SYMBOL(pcim_iomap_regions_request_all); + +/** + * pcim_iounmap_regions - Unmap and release PCI BARs + * @pdev: PCI device to map IO resources for + * @mask: Mask of BARs to unmap and release + * + * Unamp and release regions specified by @mask. + */ +void pcim_iounmap_regions(struct pci_dev *pdev, u16 mask) +{ + void __iomem * const *iomap; + int i; + + iomap = pcim_iomap_table(pdev); + if (!iomap) + return; + + for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { + if (!(mask & (1 << i))) + continue; + + pcim_iounmap(pdev, iomap[i]); + pci_release_region(pdev, i); + } +} +EXPORT_SYMBOL(pcim_iounmap_regions); +#endif +#endif diff --git a/libdde-linux26/contrib/lib/kobject.c b/libdde-linux26/contrib/lib/kobject.c index 0487d1f6..a1682ef4 100644 --- a/libdde-linux26/contrib/lib/kobject.c +++ b/libdde-linux26/contrib/lib/kobject.c @@ -794,7 +794,7 @@ static struct kset *kset_create(const char *name, kset = kzalloc(sizeof(*kset), GFP_KERNEL); if (!kset) return NULL; - kobject_set_name(&kset->kobj, name); + kobject_set_name(&kset->kobj, "%s", name); kset->uevent_ops = uevent_ops; kset->kobj.parent = parent_kobj; diff --git a/libdde-linux26/contrib/net/core/net-sysfs.c b/libdde-linux26/contrib/net/core/net-sysfs.c index 484f5875..2da59a0a 100644 --- a/libdde-linux26/contrib/net/core/net-sysfs.c +++ b/libdde-linux26/contrib/net/core/net-sysfs.c @@ -498,7 +498,7 @@ int netdev_register_kobject(struct net_device *net) dev->groups = groups; BUILD_BUG_ON(BUS_ID_SIZE < IFNAMSIZ); - dev_set_name(dev, net->name); + dev_set_name(dev, "%s", net->name); #ifdef CONFIG_SYSFS *groups++ = &netstat_group; diff --git a/libdde-linux26/contrib/net/core/skb_dma_map.c b/libdde-linux26/contrib/net/core/skb_dma_map.c index 86234923..07d4ac5e 100644 --- a/libdde-linux26/contrib/net/core/skb_dma_map.c +++ b/libdde-linux26/contrib/net/core/skb_dma_map.c @@ -20,7 +20,7 @@ int skb_dma_map(struct device *dev, struct sk_buff *skb, if (dma_mapping_error(dev, map)) goto out_err; - sp->dma_maps[0] = map; + sp->dma_head = map; for (i = 0; i < sp->nr_frags; i++) { skb_frag_t *fp = &sp->frags[i]; @@ -28,7 +28,7 @@ int skb_dma_map(struct device *dev, struct sk_buff *skb, fp->size, dir); if (dma_mapping_error(dev, map)) goto unwind; - sp->dma_maps[i + 1] = map; + sp->dma_maps[i] = map; } sp->num_dma_maps = i + 1; @@ -38,10 +38,10 @@ unwind: while (--i >= 0) { skb_frag_t *fp = &sp->frags[i]; - dma_unmap_page(dev, sp->dma_maps[i + 1], + dma_unmap_page(dev, sp->dma_maps[i], fp->size, dir); } - dma_unmap_single(dev, sp->dma_maps[0], + dma_unmap_single(dev, sp->dma_head, skb_headlen(skb), dir); out_err: return -ENOMEM; @@ -54,12 +54,12 @@ void skb_dma_unmap(struct device *dev, struct sk_buff *skb, struct skb_shared_info *sp = skb_shinfo(skb); int i; - dma_unmap_single(dev, sp->dma_maps[0], + dma_unmap_single(dev, sp->dma_head, skb_headlen(skb), dir); for (i = 0; i < sp->nr_frags; i++) { skb_frag_t *fp = &sp->frags[i]; - dma_unmap_page(dev, sp->dma_maps[i + 1], + dma_unmap_page(dev, sp->dma_maps[i], fp->size, dir); } } diff --git a/libdde-linux26/include/linux/device.h b/libdde-linux26/include/linux/device.h index 41b4227d..3dc6e94e 100644 --- a/libdde-linux26/include/linux/device.h +++ b/libdde-linux26/include/linux/device.h @@ -553,7 +553,10 @@ extern const char *dev_driver_string(const struct device *dev); printk(level "%s %s: " format , dev_driver_string(dev) , \ dev_name(dev) , ## arg) #else -#define dev_printk(level, dev, format, arg...) +#include <stdio.h> +#define dev_printk(level, dev, format, arg...) \ + fprintf(stderr, level "%s %s: " format, \ + dev_driver_string(dev), dev_name(dev), ## arg) #endif #define dev_emerg(dev, format, arg...) \ diff --git a/libdde-linux26/include/linux/kernel.h b/libdde-linux26/include/linux/kernel.h index 573ed07c..63549398 100644 --- a/libdde-linux26/include/linux/kernel.h +++ b/libdde-linux26/include/linux/kernel.h @@ -363,6 +363,8 @@ static inline char *pack_hex_byte(char *buf, u8 byte) printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__) #define pr_info(fmt, ...) \ printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__) +#define pr_cont(fmt, ...) \ + printk(KERN_CONT fmt, ##__VA_ARGS__) #if defined(DEBUG) #ifndef DDE_LINUX diff --git a/libdde-linux26/lib/src/Makefile b/libdde-linux26/lib/src/Makefile index 4f1ec099..abcc533e 100644 --- a/libdde-linux26/lib/src/Makefile +++ b/libdde-linux26/lib/src/Makefile @@ -91,6 +91,8 @@ SRC_C_libdde_linux26.o.a += \ kernel/kthread.c \ kernel/mutex.c \ kernel/notifier.c \ + kernel/rcupdate.c \ + kernel/rcuclassic.c \ kernel/resource.c \ kernel/rwsem.c \ kernel/sched.c \ @@ -106,6 +108,7 @@ SRC_C_libdde_linux26.o.a += \ lib/crc32.c \ lib/ctype.c \ lib/cpumask.c \ + lib/devres.c \ lib/find_next_bit.c \ lib/hexdump.c \ lib/idr.c \ diff --git a/libdde-linux26/lib/src/arch/l4/pci.c b/libdde-linux26/lib/src/arch/l4/pci.c index b50a7353..6dd8e879 100644 --- a/libdde-linux26/lib/src/arch/l4/pci.c +++ b/libdde-linux26/lib/src/arch/l4/pci.c @@ -171,7 +171,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask) return pcibios_enable_irq(dev); #endif WARN_UNIMPL; - return -1; + return 0; } /******************************************************************************************* diff --git a/libdde-linux26/lib/src/drivers/base/core.c b/libdde-linux26/lib/src/drivers/base/core.c index e3800714..c6363dd7 100644 --- a/libdde-linux26/lib/src/drivers/base/core.c +++ b/libdde-linux26/lib/src/drivers/base/core.c @@ -1253,7 +1253,7 @@ struct device *__root_device_register(const char *name, struct module *owner) if (!root) return ERR_PTR(err); - err = dev_set_name(&root->dev, name); + err = dev_set_name(&root->dev, "%s", name); if (err) { kfree(root); return ERR_PTR(err); diff --git a/libdde-linux26/lib/src/net/core/dev.c b/libdde-linux26/lib/src/net/core/dev.c index cf036525..3c3a1d13 100644 --- a/libdde-linux26/lib/src/net/core/dev.c +++ b/libdde-linux26/lib/src/net/core/dev.c @@ -1731,6 +1731,13 @@ static u16 simple_tx_hash(struct net_device *dev, struct sk_buff *skb) simple_tx_hashrnd_initialized = 1; } + if (skb_rx_queue_recorded(skb)) { + u32 val = skb_get_rx_queue(skb); + + hash = jhash_1word(val, simple_tx_hashrnd); + goto out; + } + switch (skb->protocol) { case htons(ETH_P_IP): if (!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET))) @@ -1768,6 +1775,7 @@ static u16 simple_tx_hash(struct net_device *dev, struct sk_buff *skb) hash = jhash_3words(addr1, addr2, ports, simple_tx_hashrnd); +out: return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); } @@ -3377,10 +3385,10 @@ void __dev_set_rx_mode(struct net_device *dev) /* Unicast addresses changes may only happen under the rtnl, * therefore calling __dev_set_promiscuity here is safe. */ - if (dev->uc_count > 0 && !dev->uc_promisc) { + if (dev->uc.count > 0 && !dev->uc_promisc) { __dev_set_promiscuity(dev, 1); dev->uc_promisc = 1; - } else if (dev->uc_count == 0 && dev->uc_promisc) { + } else if (dev->uc.count == 0 && dev->uc_promisc) { __dev_set_promiscuity(dev, -1); dev->uc_promisc = 0; } @@ -3397,6 +3405,316 @@ void dev_set_rx_mode(struct net_device *dev) netif_addr_unlock_bh(dev); } +/* hw addresses list handling functions */ + +static int __hw_addr_add(struct netdev_hw_addr_list *list, unsigned char *addr, + int addr_len, unsigned char addr_type) +{ + struct netdev_hw_addr *ha; + int alloc_size; + + if (addr_len > MAX_ADDR_LEN) + return -EINVAL; + + list_for_each_entry(ha, &list->list, list) { + if (!memcmp(ha->addr, addr, addr_len) && + ha->type == addr_type) { + ha->refcount++; + return 0; + } + } + + + alloc_size = sizeof(*ha); + if (alloc_size < L1_CACHE_BYTES) + alloc_size = L1_CACHE_BYTES; + ha = kmalloc(alloc_size, GFP_ATOMIC); + if (!ha) + return -ENOMEM; + memcpy(ha->addr, addr, addr_len); + ha->type = addr_type; + ha->refcount = 1; + ha->synced = false; + list_add_tail_rcu(&ha->list, &list->list); + list->count++; + return 0; +} + +static void ha_rcu_free(struct rcu_head *head) +{ + struct netdev_hw_addr *ha; + + ha = container_of(head, struct netdev_hw_addr, rcu_head); + kfree(ha); +} + +static int __hw_addr_del(struct netdev_hw_addr_list *list, unsigned char *addr, + int addr_len, unsigned char addr_type) +{ + struct netdev_hw_addr *ha; + + list_for_each_entry(ha, &list->list, list) { + if (!memcmp(ha->addr, addr, addr_len) && + (ha->type == addr_type || !addr_type)) { + if (--ha->refcount) + return 0; + list_del_rcu(&ha->list); + call_rcu(&ha->rcu_head, ha_rcu_free); + list->count--; + return 0; + } + } + return -ENOENT; +} + +static int __hw_addr_add_multiple(struct netdev_hw_addr_list *to_list, + struct netdev_hw_addr_list *from_list, + int addr_len, + unsigned char addr_type) +{ + int err; + struct netdev_hw_addr *ha, *ha2; + unsigned char type; + + list_for_each_entry(ha, &from_list->list, list) { + type = addr_type ? addr_type : ha->type; + err = __hw_addr_add(to_list, ha->addr, addr_len, type); + if (err) + goto unroll; + } + return 0; + +unroll: + list_for_each_entry(ha2, &from_list->list, list) { + if (ha2 == ha) + break; + type = addr_type ? addr_type : ha2->type; + __hw_addr_del(to_list, ha2->addr, addr_len, type); + } + return err; +} + +static void __hw_addr_del_multiple(struct netdev_hw_addr_list *to_list, + struct netdev_hw_addr_list *from_list, + int addr_len, + unsigned char addr_type) +{ + struct netdev_hw_addr *ha; + unsigned char type; + + list_for_each_entry(ha, &from_list->list, list) { + type = addr_type ? addr_type : ha->type; + __hw_addr_del(to_list, ha->addr, addr_len, addr_type); + } +} + +static int __hw_addr_sync(struct netdev_hw_addr_list *to_list, + struct netdev_hw_addr_list *from_list, + int addr_len) +{ + int err = 0; + struct netdev_hw_addr *ha, *tmp; + + list_for_each_entry_safe(ha, tmp, &from_list->list, list) { + if (!ha->synced) { + err = __hw_addr_add(to_list, ha->addr, + addr_len, ha->type); + if (err) + break; + ha->synced = true; + ha->refcount++; + } else if (ha->refcount == 1) { + __hw_addr_del(to_list, ha->addr, addr_len, ha->type); + __hw_addr_del(from_list, ha->addr, addr_len, ha->type); + } + } + return err; +} + +static void __hw_addr_unsync(struct netdev_hw_addr_list *to_list, + struct netdev_hw_addr_list *from_list, + int addr_len) +{ + struct netdev_hw_addr *ha, *tmp; + + list_for_each_entry_safe(ha, tmp, &from_list->list, list) { + if (ha->synced) { + __hw_addr_del(to_list, ha->addr, + addr_len, ha->type); + ha->synced = false; + __hw_addr_del(from_list, ha->addr, + addr_len, ha->type); + } + } +} + +static void __hw_addr_flush(struct netdev_hw_addr_list *list) +{ + struct netdev_hw_addr *ha, *tmp; + + list_for_each_entry_safe(ha, tmp, &list->list, list) { + list_del_rcu(&ha->list); + call_rcu(&ha->rcu_head, ha_rcu_free); + } + list->count = 0; +} + +static void __hw_addr_init(struct netdev_hw_addr_list *list) +{ + INIT_LIST_HEAD(&list->list); + list->count = 0; +} + +/* Device addresses handling functions */ + +static void dev_addr_flush(struct net_device *dev) +{ + /* rtnl_mutex must be held here */ + + __hw_addr_flush(&dev->dev_addrs); + dev->dev_addr = NULL; +} + +static int dev_addr_init(struct net_device *dev) +{ + unsigned char addr[MAX_ADDR_LEN]; + struct netdev_hw_addr *ha; + int err; + + /* rtnl_mutex must be held here */ + + __hw_addr_init(&dev->dev_addrs); + memset(addr, 0, sizeof(addr)); + err = __hw_addr_add(&dev->dev_addrs, addr, sizeof(addr), + NETDEV_HW_ADDR_T_LAN); + if (!err) { + /* + * Get the first (previously created) address from the list + * and set dev_addr pointer to this location. + */ + ha = list_first_entry(&dev->dev_addrs.list, + struct netdev_hw_addr, list); + dev->dev_addr = ha->addr; + } + return err; +} + +/** + * dev_addr_add - Add a device address + * @dev: device + * @addr: address to add + * @addr_type: address type + * + * Add a device address to the device or increase the reference count if + * it already exists. + * + * The caller must hold the rtnl_mutex. + */ +int dev_addr_add(struct net_device *dev, unsigned char *addr, + unsigned char addr_type) +{ + int err; + + ASSERT_RTNL(); + + err = __hw_addr_add(&dev->dev_addrs, addr, dev->addr_len, addr_type); + if (!err) + call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); + return err; +} +EXPORT_SYMBOL(dev_addr_add); + +/** + * dev_addr_del - Release a device address. + * @dev: device + * @addr: address to delete + * @addr_type: address type + * + * Release reference to a device address and remove it from the device + * if the reference count drops to zero. + * + * The caller must hold the rtnl_mutex. + */ +int dev_addr_del(struct net_device *dev, unsigned char *addr, + unsigned char addr_type) +{ + int err; + struct netdev_hw_addr *ha; + + ASSERT_RTNL(); + + /* + * We can not remove the first address from the list because + * dev->dev_addr points to that. + */ + ha = list_first_entry(&dev->dev_addrs.list, + struct netdev_hw_addr, list); + if (ha->addr == dev->dev_addr && ha->refcount == 1) + return -ENOENT; + + err = __hw_addr_del(&dev->dev_addrs, addr, dev->addr_len, + addr_type); + if (!err) + call_netdevice_notifiers(NETDEV_CHANGEADDR, dev); + return err; +} +EXPORT_SYMBOL(dev_addr_del); + +/** + * dev_addr_add_multiple - Add device addresses from another device + * @to_dev: device to which addresses will be added + * @from_dev: device from which addresses will be added + * @addr_type: address type - 0 means type will be used from from_dev + * + * Add device addresses of the one device to another. + ** + * The caller must hold the rtnl_mutex. + */ +int dev_addr_add_multiple(struct net_device *to_dev, + struct net_device *from_dev, + unsigned char addr_type) +{ + int err; + + ASSERT_RTNL(); + + if (from_dev->addr_len != to_dev->addr_len) + return -EINVAL; + err = __hw_addr_add_multiple(&to_dev->dev_addrs, &from_dev->dev_addrs, + to_dev->addr_len, addr_type); + if (!err) + call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); + return err; +} +EXPORT_SYMBOL(dev_addr_add_multiple); + +/** + * dev_addr_del_multiple - Delete device addresses by another device + * @to_dev: device where the addresses will be deleted + * @from_dev: device by which addresses the addresses will be deleted + * @addr_type: address type - 0 means type will used from from_dev + * + * Deletes addresses in to device by the list of addresses in from device. + * + * The caller must hold the rtnl_mutex. + */ +int dev_addr_del_multiple(struct net_device *to_dev, + struct net_device *from_dev, + unsigned char addr_type) +{ + ASSERT_RTNL(); + + if (from_dev->addr_len != to_dev->addr_len) + return -EINVAL; + __hw_addr_del_multiple(&to_dev->dev_addrs, &from_dev->dev_addrs, + to_dev->addr_len, addr_type); + call_netdevice_notifiers(NETDEV_CHANGEADDR, to_dev); + return 0; +} +EXPORT_SYMBOL(dev_addr_del_multiple); + +/* multicast addresses handling functions */ + int __dev_addr_delete(struct dev_addr_list **list, int *count, void *addr, int alen, int glbl) { @@ -3459,24 +3777,22 @@ int __dev_addr_add(struct dev_addr_list **list, int *count, * dev_unicast_delete - Release secondary unicast address. * @dev: device * @addr: address to delete - * @alen: length of @addr * * Release reference to a secondary unicast address and remove it * from the device if the reference count drops to zero. * * The caller must hold the rtnl_mutex. */ -int dev_unicast_delete(struct net_device *dev, void *addr, int alen) +int dev_unicast_delete(struct net_device *dev, void *addr) { int err; ASSERT_RTNL(); - netif_addr_lock_bh(dev); - err = __dev_addr_delete(&dev->uc_list, &dev->uc_count, addr, alen, 0); + err = __hw_addr_del(&dev->uc, addr, dev->addr_len, + NETDEV_HW_ADDR_T_UNICAST); if (!err) __dev_set_rx_mode(dev); - netif_addr_unlock_bh(dev); return err; } EXPORT_SYMBOL(dev_unicast_delete); @@ -3485,24 +3801,22 @@ EXPORT_SYMBOL(dev_unicast_delete); * dev_unicast_add - add a secondary unicast address * @dev: device * @addr: address to add - * @alen: length of @addr * * Add a secondary unicast address to the device or increase * the reference count if it already exists. * * The caller must hold the rtnl_mutex. */ -int dev_unicast_add(struct net_device *dev, void *addr, int alen) +int dev_unicast_add(struct net_device *dev, void *addr) { int err; ASSERT_RTNL(); - netif_addr_lock_bh(dev); - err = __dev_addr_add(&dev->uc_list, &dev->uc_count, addr, alen, 0); + err = __hw_addr_add(&dev->uc, addr, dev->addr_len, + NETDEV_HW_ADDR_T_UNICAST); if (!err) __dev_set_rx_mode(dev); - netif_addr_unlock_bh(dev); return err; } EXPORT_SYMBOL(dev_unicast_add); @@ -3559,8 +3873,7 @@ void __dev_addr_unsync(struct dev_addr_list **to, int *to_count, * @from: source device * * Add newly added addresses to the destination device and release - * addresses that have no users left. The source device must be - * locked by netif_addr_lock_bh. + * addresses that have no users left. * * This function is intended to be called from the dev->set_rx_mode * function of layered software devices. @@ -3569,12 +3882,14 @@ int dev_unicast_sync(struct net_device *to, struct net_device *from) { int err = 0; - netif_addr_lock_bh(to); - err = __dev_addr_sync(&to->uc_list, &to->uc_count, - &from->uc_list, &from->uc_count); + ASSERT_RTNL(); + + if (to->addr_len != from->addr_len) + return -EINVAL; + + err = __hw_addr_sync(&to->uc, &from->uc, to->addr_len); if (!err) __dev_set_rx_mode(to); - netif_addr_unlock_bh(to); return err; } EXPORT_SYMBOL(dev_unicast_sync); @@ -3590,18 +3905,31 @@ EXPORT_SYMBOL(dev_unicast_sync); */ void dev_unicast_unsync(struct net_device *to, struct net_device *from) { - netif_addr_lock_bh(from); - netif_addr_lock(to); + ASSERT_RTNL(); - __dev_addr_unsync(&to->uc_list, &to->uc_count, - &from->uc_list, &from->uc_count); - __dev_set_rx_mode(to); + if (to->addr_len != from->addr_len) + return; - netif_addr_unlock(to); - netif_addr_unlock_bh(from); + __hw_addr_unsync(&to->uc, &from->uc, to->addr_len); + __dev_set_rx_mode(to); } EXPORT_SYMBOL(dev_unicast_unsync); +static void dev_unicast_flush(struct net_device *dev) +{ + /* rtnl_mutex must be held here */ + + __hw_addr_flush(&dev->uc); +} + +static void dev_unicast_init(struct net_device *dev) +{ + /* rtnl_mutex must be held here */ + + __hw_addr_init(&dev->uc); +} + + static void __dev_addr_discard(struct dev_addr_list **list) { struct dev_addr_list *tmp; @@ -3620,9 +3948,6 @@ static void dev_addr_discard(struct net_device *dev) { netif_addr_lock_bh(dev); - __dev_addr_discard(&dev->uc_list); - dev->uc_count = 0; - __dev_addr_discard(&dev->mc_list); dev->mc_count = 0; @@ -4213,6 +4538,7 @@ static void rollback_registered(struct net_device *dev) /* * Flush the unicast and multicast chains */ + dev_unicast_flush(dev); dev_addr_discard(dev); if (dev->netdev_ops->ndo_uninit) @@ -4729,6 +5055,8 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, dev = (struct net_device *) (((long)p + NETDEV_ALIGN_CONST) & ~NETDEV_ALIGN_CONST); dev->padded = (char *)dev - (char *)p; + dev_unicast_init(dev); + dev_net_set(dev, &init_net); dev->_tx = tx; @@ -4737,6 +5065,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, dev->gso_max_size = GSO_MAX_SIZE; + dev_addr_init(dev); netdev_init_queues(dev); INIT_LIST_HEAD(&dev->napi_list); @@ -4762,6 +5091,9 @@ void free_netdev(struct net_device *dev) kfree(dev->_tx); + /* Flush device addresses */ + dev_addr_flush(dev); + list_for_each_entry_safe(p, n, &dev->napi_list, dev_list) netif_napi_del(p); @@ -4923,6 +5255,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char /* * Flush the unicast and multicast chains */ + dev_unicast_flush(dev); dev_addr_discard(dev); netdev_unregister_kobject(dev); diff --git a/libdde-linux26/lib/src/net/sched/sch_generic.c b/libdde-linux26/lib/src/net/sched/sch_generic.c index a2acd6c4..252ac987 100644 --- a/libdde-linux26/lib/src/net/sched/sch_generic.c +++ b/libdde-linux26/lib/src/net/sched/sch_generic.c @@ -200,6 +200,21 @@ void __qdisc_run(struct Qdisc *q) clear_bit(__QDISC_STATE_RUNNING, &q->state); } +unsigned long dev_trans_start(struct net_device *dev) +{ + unsigned long val, res = dev->trans_start; + unsigned int i; + + for (i = 0; i < dev->num_tx_queues; i++) { + val = netdev_get_tx_queue(dev, i)->trans_start; + if (val && time_after(val, res)) + res = val; + } + dev->trans_start = res; + return res; +} +EXPORT_SYMBOL(dev_trans_start); + static void dev_watchdog(unsigned long arg) { struct net_device *dev = (struct net_device *)arg; @@ -209,25 +224,30 @@ static void dev_watchdog(unsigned long arg) if (netif_device_present(dev) && netif_running(dev) && netif_carrier_ok(dev)) { - int some_queue_stopped = 0; + int some_queue_timedout = 0; unsigned int i; + unsigned long trans_start; for (i = 0; i < dev->num_tx_queues; i++) { struct netdev_queue *txq; txq = netdev_get_tx_queue(dev, i); - if (netif_tx_queue_stopped(txq)) { - some_queue_stopped = 1; + /* + * old device drivers set dev->trans_start + */ + trans_start = txq->trans_start ? : dev->trans_start; + if (netif_tx_queue_stopped(txq) && + time_after(jiffies, (trans_start + + dev->watchdog_timeo))) { + some_queue_timedout = 1; break; } } - if (some_queue_stopped && - time_after(jiffies, (dev->trans_start + - dev->watchdog_timeo))) { + if (some_queue_timedout) { char drivername[64]; - WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit timed out\n", - dev->name, netdev_drivername(dev, drivername, 64)); + WARN_ONCE(1, KERN_INFO "NETDEV WATCHDOG: %s (%s): transmit queue %u timed out\n", + dev->name, netdev_drivername(dev, drivername, 64), i); dev->netdev_ops->ndo_tx_timeout(dev); } if (!mod_timer(&dev->watchdog_timer, @@ -612,8 +632,10 @@ static void transition_one_qdisc(struct net_device *dev, clear_bit(__QDISC_STATE_DEACTIVATED, &new_qdisc->state); rcu_assign_pointer(dev_queue->qdisc, new_qdisc); - if (need_watchdog_p && new_qdisc != &noqueue_qdisc) + if (need_watchdog_p && new_qdisc != &noqueue_qdisc) { + dev_queue->trans_start = 0; *need_watchdog_p = 1; + } } void dev_activate(struct net_device *dev) |