compat: backport pci_is_pcie and pci_pcie_cap
[~emulex/for-vlad/old/compat.git] / compat / compat-2.6.24.c
1 /*
2  * Copyright 2007       Luis R. Rodriguez <mcgrof@winlab.rutgers.edu>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * Compatibility file for Linux wireless for kernels 2.6.24.
9  */
10
11 #include <net/compat.h>
12 #include <net/arp.h>
13
14 /*
15  * We simply won't use it though, just declare it for our wrappers and
16  * for usage with tons of code that makes mention to it.
17  */
18 struct net init_net;
19 EXPORT_SYMBOL(init_net);
20
21 /* Part of net/ethernet/eth.c as of 2.6.24 */
22 char *print_mac(char *buf, const u8 *addr)
23 {
24         sprintf(buf, MAC_FMT,
25                 addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
26         return buf;
27 }
28 EXPORT_SYMBOL(print_mac);
29
30 /* 2.6.22 and 2.6.23 have eth_header_cache_update defined as extern in include/linux/etherdevice.h
31  * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
32
33 /**
34  * eth_header_cache_update - update cache entry
35  * @hh: destination cache entry
36  * @dev: network device
37  * @haddr: new hardware address
38  *
39  * Called by Address Resolution module to notify changes in address.
40  */
41 void eth_header_cache_update(struct hh_cache *hh,
42                              struct net_device *dev,
43                              unsigned char *haddr)
44 {
45         memcpy(((u8 *) hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)),
46                 haddr, ETH_ALEN);
47 }
48 EXPORT_SYMBOL(eth_header_cache_update);
49
50 /* 2.6.22 and 2.6.23 have eth_header_cache defined as extern in include/linux/etherdevice.h
51  * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
52
53 /**
54  * eth_header_cache - fill cache entry from neighbour
55  * @neigh: source neighbour
56  * @hh: destination cache entry
57  * Create an Ethernet header template from the neighbour.
58  */
59 int eth_header_cache(struct neighbour *neigh, struct hh_cache *hh)
60 {
61         __be16 type = hh->hh_type;
62         struct ethhdr *eth;
63         const struct net_device *dev = neigh->dev;
64
65         eth = (struct ethhdr *)
66             (((u8 *) hh->hh_data) + (HH_DATA_OFF(sizeof(*eth))));
67
68         if (type == htons(ETH_P_802_3))
69                 return -1;
70
71         eth->h_proto = type;
72         memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
73         memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
74         hh->hh_len = ETH_HLEN;
75         return 0;
76 }
77 EXPORT_SYMBOL(eth_header_cache);
78
79 /* 2.6.22 and 2.6.23 have eth_header() defined as extern in include/linux/etherdevice.h
80  * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
81
82 /**
83  * eth_header - create the Ethernet header
84  * @skb:        buffer to alter
85  * @dev:        source device
86  * @type:       Ethernet type field
87  * @daddr: destination address (NULL leave destination address)
88  * @saddr: source address (NULL use device source address)
89  * @len:   packet length (<= skb->len)
90  *
91  *
92  * Set the protocol type. For a packet of type ETH_P_802_3 we put the length
93  * in here instead. It is up to the 802.2 layer to carry protocol information.
94  */
95 int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
96                void *daddr, void *saddr, unsigned len)
97 {
98         struct ethhdr *eth = (struct ethhdr *)skb_push(skb, ETH_HLEN);
99
100         if (type != ETH_P_802_3)
101                 eth->h_proto = htons(type);
102         else
103                 eth->h_proto = htons(len);
104
105         /*
106          *      Set the source hardware address.
107          */
108
109         if (!saddr)
110                 saddr = dev->dev_addr;
111         memcpy(eth->h_source, saddr, dev->addr_len);
112
113         if (daddr) {
114                 memcpy(eth->h_dest, daddr, dev->addr_len);
115                 return ETH_HLEN;
116         }
117
118         /*
119          *      Anyway, the loopback-device should never use this function...
120          */
121
122         if (dev->flags & (IFF_LOOPBACK | IFF_NOARP)) {
123                 memset(eth->h_dest, 0, dev->addr_len);
124                 return ETH_HLEN;
125         }
126
127         return -ETH_HLEN;
128 }
129
130 EXPORT_SYMBOL(eth_header);
131
132 /* 2.6.22 and 2.6.23 have eth_rebuild_header defined as extern in include/linux/etherdevice.h
133  * and actually defined in net/ethernet/eth.c but 2.6.24 exports it. Lets export it here */
134
135 /**
136  * eth_rebuild_header- rebuild the Ethernet MAC header.
137  * @skb: socket buffer to update
138  *
139  * This is called after an ARP or IPV6 ndisc it's resolution on this
140  * sk_buff. We now let protocol (ARP) fill in the other fields.
141  *
142  * This routine CANNOT use cached dst->neigh!
143  * Really, it is used only when dst->neigh is wrong.
144  */
145 int eth_rebuild_header(struct sk_buff *skb)
146 {
147         struct ethhdr *eth = (struct ethhdr *)skb->data;
148         struct net_device *dev = skb->dev;
149
150         switch (eth->h_proto) {
151 #ifdef CONFIG_INET
152         case __constant_htons(ETH_P_IP):
153                 return arp_find(eth->h_dest, skb);
154 #endif
155         default:
156                 printk(KERN_DEBUG
157                        "%s: unable to resolve type %X addresses.\n",
158                        dev->name, (int)eth->h_proto);
159
160                 memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
161                 break;
162         }
163
164         return 0;
165 }
166 EXPORT_SYMBOL(eth_rebuild_header);
167